我是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
关闭它会同时关闭父级和子级。如果我不使用它,而是单击子级的OK按钮(调用on_buttonBox_accepted()
函数),则该子级将关闭,并且父窗口小部件将按预期方式显示。如果我没有将父窗口小部件传递给主窗口中的子窗口小部件,则QFileDialog
不再在运行时关闭子窗口小部件。我尝试将QFileDialog的父级更改为this
或nullptr
,但这没有帮助。
我认为我的问题类似于QFileDialog closes window when called
或PyQt5 QFileDialog finishes app when called from child window
但是我无法从他们那里找到对我有用的解决方案。
答案 0 :(得分:0)
长话短说,第二个窗口没有显示,没有等待接收接受呼叫的操作,所以我的应用程序死了。如果在上一个关闭的窗口上退出的属性是,则可以防止这种情况。 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();
}