2

现在我可以这样做:

void MainWindow::on_actionPATH_triggered() {
    std::unique_ptr<QDialog> win(new QDialog());
    win->exec();
}

我应该async在单独的线程中使用/运行以避免阻塞主窗口,还是有办法订阅关闭甚至删除/释放对象?

4

1 回答 1

3

你可以只使用show()

void MainWindow::on_actionPATH_triggered() {
    QDialog* win = new QDialog();
    //needed connect
    win->setAttribute(Qt::WA_DeleteOnClose);//we don't want memory leak
    win->show();
}

并使用

win->setModal(false);//but it is default option, you don't need to change it

来自文档

默认情况下,此属性为 false,并且 show() 将对话框弹出为无模式。将他的属性设置为true相当于将QWidget::windowModality设置为Qt::ApplicationModal。exec() 忽略此属性的值并始终以模式弹出对话框。

Qt::WA_DeleteOnClose当用户关闭它时,将删除您的对话框。

您还可以将父级设置为对话框:

QDialog* win = new QDialog(this);

在这种情况下win,将使用您的 mainWindow 删除。

Qt 父子关系信息

而且你不需要在这里单独的线程。

于 2014-12-08T17:32:23.490 回答