qt exec()无法关闭

时间:2017-01-30 17:02:25

标签: c++ qt

我使用Qt5.7在C ++中编码。我正面临着QDialog exec()的问题。我需要它以模态,所以我不能使用show()。对话框完成并关闭后,UI将消失,但对话框变量和函数仍在运行。该对话框有一个定时器功能,用于将字节发送到串口,该口在关闭对话框后继续发送。相反,当我使用show()代替时,这不会发生。请帮忙。

我故意使用冗余命令进行测试,例如: QuitOnClose和DeleteOnClose ......但它们都没有按预期工作。

该对话框在MainWindow中创建

wizard = new Wizard();
wizard->setAttribute(Qt::WA_QuitOnClose);
wizard->setAttribute(Qt::WA_DeleteOnClose, true);
connect(wizard, SIGNAL(closeWizardForm()), this, SLOT(closeWizardForm()));
wizard->exec();

void MainWindow::closeWizardForm()

wizard->destroyed();
wizard = NULL;

在对话框中,它以

关闭
void Wizard::closeEvent(QCloseEvent *event)

// "x" button clicked
if (changeMade == true){
    // give warning if changes not saved
    QMessageBox::StandardButton resBtn = QMessageBox::critical(this, "Setup Wizard", tr("Unsaved data will be lost. \r\n"
                                                                                        " Are you sure you want to quit?"),
                                                               QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
    if (resBtn != QMessageBox::Yes){
        event->ignore();
        return;
    }
}
// continue to quit
emit closeWizardForm();
event->accept();
this->close();

}

非常感谢您的关注。

SP。

1 个答案:

答案 0 :(得分:0)

我在这里看不到删除Wizard对象的语句。在那里的某个地方,我希望看到:

delete wizard;

这意味着您的向导对象仍然存在,并且计时器仍将运行。在这种情况下,我不认为你会得到“show”与“exec”不同的结果,但也许你在两者之间切换时会改变别的东西。

发出“被破坏”的信号不会破坏物体,我认为你不应该自己发射它。我相信当您删除对象时,QObject析构函数会为您执行此操作。如果您发现这是必要的,那可能是因为您从未删除过该对象,因此从未调用过QObject析构函数。