我是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
时,用OK
或Cancel
关闭它会同时关闭父级和子级。如果我不使用它,但单击调用on_buttonBox_accepted()
函数的子窗口的OK按钮,则子窗口将关闭,父窗口小部件将按预期显示。如果我不在主窗口中将父窗口小部件传递给子窗口小部件,QFileDialog
在运行时将不再关闭子窗口小程序。我尝试将QFileDialog的父级更改为this
或nullptr
,但没有帮助。
我想我的问题类似于QFileDialog在调用时关闭窗口
或PyQt5 QFileDialog在从子窗口调用时完成应用程序
但我无法从他们那里提取出对我有用的解决方案
长话短说,第二个窗口没有显示,也没有等待接收accept调用的操作,所以我的应用程序就死了。如果禁用了"关闭最后一个窗口时退出"属性,则可以防止这种情况发生。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();
}