Qt5 QFileDialog 也关闭父对话框
Qt5 QFileDialog closes parent dialog as well
我有一个带有 'Save' 按钮的自定义 QDialog,它应该使用 QFileDialog 提示用户并将 Table 小部件的内容保存到文件,但保持对话框打开。
这是打开对话框并保存数据的函数:
bool ResultsDialog::saveData()
{
QString outfile = QFileDialog::getSaveFileName(this, tr("Save results"), tr(""), tr("CSV Files (*.csv)") );
if (outfile.isNull() || outfile.isEmpty() )
return false;
if (!CSVIO::write_to_csv(*ui->tableWidget, outfile) )
{
QMessageBox::critical(this, "Failed to save...", QString("Could not save file: %1").arg(outfile) );
return false;
}
return true;
}
这是保存按钮槽的代码:
void ResultsDialog::on_saveButton_clicked()
{
if (saveData() )
{
saved = true;
}
}
编辑:这是创建和打开结果对话框的代码:
void MainWindow::displayResults()
{
ResultsDialog *resultsDialog = new ResultsDialog(this);
resultsDialog->setWindowTitle(windowTitle() );
resultsDialog->setWindowIcon(windowIcon() );
connect(resultsDialog, &ResultsDialog::finished, this, &MainWindow::close);
resultsDialog->fill(playlistTable, notes);
resultsDialog->setModal(true);
resultsDialog->open();
this->hide();
}
问题是,一旦 QFileDialog 关闭,我的 QDialog 也随之关闭,控制台上打印以下消息:
qt.qpa.xcb: QXcbConnection: XCB error: 3 (BadWindow), sequence: 13049,
resource id: 25205189, major code: 40 (TranslateCoords), minor code: 0
11:59:01: /home/user1/workspace/build-App-Desktop-Debug/App exited
with code 0
请注意,我的自定义对话框的父级 MainWindow 已隐藏。当它没有被隐藏时,这个问题就消失了,但这不是一个选项,因为我希望隐藏 MainWindow。
我在 Debian Bullseye 上使用 Qt 5.15。
您正在将 MainWindow 的终止挂接到 ResultsDialog 仍在处理时发出的信号。 ResultsDialog 将 MainWindow 作为其父级,因此当子级仍然 运行 时,父级(及其子级!!)被销毁。这种结构不会产生任何好处。
编辑:您看到的错误消息不是问题的根源,只是表明 window 突然关闭。这正是你所描述的。
编辑 2:请参阅评论部分以了解解决方法(将 0 作为父级传递给对话框)并猜测解决方法为何有效。
我有一个带有 'Save' 按钮的自定义 QDialog,它应该使用 QFileDialog 提示用户并将 Table 小部件的内容保存到文件,但保持对话框打开。
这是打开对话框并保存数据的函数:
bool ResultsDialog::saveData()
{
QString outfile = QFileDialog::getSaveFileName(this, tr("Save results"), tr(""), tr("CSV Files (*.csv)") );
if (outfile.isNull() || outfile.isEmpty() )
return false;
if (!CSVIO::write_to_csv(*ui->tableWidget, outfile) )
{
QMessageBox::critical(this, "Failed to save...", QString("Could not save file: %1").arg(outfile) );
return false;
}
return true;
}
这是保存按钮槽的代码:
void ResultsDialog::on_saveButton_clicked()
{
if (saveData() )
{
saved = true;
}
}
编辑:这是创建和打开结果对话框的代码:
void MainWindow::displayResults()
{
ResultsDialog *resultsDialog = new ResultsDialog(this);
resultsDialog->setWindowTitle(windowTitle() );
resultsDialog->setWindowIcon(windowIcon() );
connect(resultsDialog, &ResultsDialog::finished, this, &MainWindow::close);
resultsDialog->fill(playlistTable, notes);
resultsDialog->setModal(true);
resultsDialog->open();
this->hide();
}
问题是,一旦 QFileDialog 关闭,我的 QDialog 也随之关闭,控制台上打印以下消息:
qt.qpa.xcb: QXcbConnection: XCB error: 3 (BadWindow), sequence: 13049, resource id: 25205189, major code: 40 (TranslateCoords), minor code: 0
11:59:01: /home/user1/workspace/build-App-Desktop-Debug/App exited with code 0
请注意,我的自定义对话框的父级 MainWindow 已隐藏。当它没有被隐藏时,这个问题就消失了,但这不是一个选项,因为我希望隐藏 MainWindow。
我在 Debian Bullseye 上使用 Qt 5.15。
您正在将 MainWindow 的终止挂接到 ResultsDialog 仍在处理时发出的信号。 ResultsDialog 将 MainWindow 作为其父级,因此当子级仍然 运行 时,父级(及其子级!!)被销毁。这种结构不会产生任何好处。
编辑:您看到的错误消息不是问题的根源,只是表明 window 突然关闭。这正是你所描述的。
编辑 2:请参阅评论部分以了解解决方法(将 0 作为父级传递给对话框)并猜测解决方法为何有效。