子窗口中的QFileDialog关闭应用程序

时间:2019-01-24 21:35:23

标签: qt qt5 qfiledialog

我是QT的新手,从子窗口调用QFileDialog时遇到问题。我的应用程序相对简单。我有一个提示窗口小部件,可获取用户输入,然后在其父级上运行show。 这是我的主力。

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    ParentWidjet w(nullptr);

    ChildWidget input(&w);
    input.show();

    return a.exec();
}

这是子窗口小部件的相关部分:

ChildWidget::ChildWidget(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::InputPrompt){
    ui->setupUi(this);
    this->setParent(parent);
}
...
void ChildWidget::on_imagesSelect_clicked() {
    inputFilepath = QFileDialog::getExistingDirectory(static_cast<ParentWidget *>(this->parent()), QCoreApplication::translate("main", "Open directory"), "./", QFileDialog::ShowDirsOnly);
    ui->inputPath->setPlainText(inputFilepath);
    std::cout << "y u exit" << std::endl;
}
//Setup and show the parent
void ChildWidget::on_buttonBox_accepted() {
    static_cast<ParentWidjet *>(this->parent())->setup(inputFilepath, outputFilepath);
    static_cast<ParentWidjet *>(this->parent())->show();
}

由于某种原因,调用QFileDialog时,用OKCancel关闭它会同时关闭父级和子级。如果我不使用它,而是单击子级的OK按钮(调用on_buttonBox_accepted()函数),则该子级将关闭,并且父窗口小部件将按预期方式显示。如果我没有将父窗口小部件传递给主窗口中的子窗口小部件,则QFileDialog不再在运行时关闭子窗口小部件。我尝试将QFileDialog的父级更改为thisnullptr,但这没有帮助。

我认为我的问题类似于QFileDialog closes window when called

PyQt5 QFileDialog finishes app when called from child window

但是我无法从他们那里找到对我有用的解决方案。

1 个答案:

答案 0 :(得分:0)

长话短说,第二个窗口没有显示,没有等待接收接受呼叫的操作,所以我的应用程序死了。如果在上一个关闭的窗口上退出的属性是sumbenu,则可以防止这种情况。 Qt论坛提出了一种解决方案,以及一些更好的设计选择。这就是我最后的目的。

int main(int argc, char *argv[]) {
   QApplication a(argc, argv);

   ParentWidget w(nullptr);

   ChildWidget input;
   if (  input.exec() == QDialog::accepted)   // exec() blocks execution until ok/cancel. unlike show()
   {
     w.setup(input.inputFilepath, input.outputFilepath); // assuming these are public
     w.show()
   } else 
   {  // user closed or pressed cancelled
     ... what u want to do..
   }

    return a.exec();
}