如何得到QDialog::show()的结果?

How to get the result of QDialog::show()?

我想在我的项目中将 exec 用法转换为 show 方法。因为,当我将 exec 用于 windows(对话框)时,我无法打开另一个 window。这是 exec()show() 方法之间的基本区别。

execshow 以不同的方式工作,我想知道如何使用 show() 而不是 exec() 来更改下面的代码。

例如:

int result = exampleWindow->exec();

if ( result == QDialogButtonBox::Ok )
{
    exampleWindow->UpdateCalibrationData(&data);
    exampleWindow->UpdateFilterData(&filterData);
    exampleWindow();
}

exec() 方法显示模态对话框,如所述here

例如,您可以使用对话框的 closeEvent()。在里面你可以这样写:

void ExmpleWin::closeEvent(QCloseEvent *event)
{
    if (/*Your condition*/) {
        emit signalUpdateMyData();
        event->accept();
    }
}

您还必须将信号 signalUpdateMyData() 连接到适当的插槽,您可以在其中进行:

exampleWindow->UpdateCalibrationData(&data);
exampleWindow->UpdateFilterData(&filterData);
exampleWindow();

show() 显示非模态 window;

exec() 显示模态 window.

如果你想得到show()的结果,那就用Qt signals/slots:

ExampleWindow::ExampleWindow(QWidget *parent) : QDialog(parent)
{
    // Assuming the QDialogButtonBox name is "buttonBox":
    connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
    connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
}

MainWindow.h:

class MainWindow : public QMainWindow {
    Q_OBJECT
private slots:
    void updateData();
}

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    connect(exampleWindow, SIGNAL(accepted()), this, SLOT(updateData()));
}

void MainWindow::updateData()
{
    // Your code:
    exampleWindow->UpdateCalibrationData(&data);
    exampleWindow->UpdateFilterData(&filterData);
    exampleWindow();
}

show() 只是让对话框 window 可见。这是一个QWidget方法。

exec(),当在 class 中提供时,总是旋转一个事件循环。特别是在对话框的情况下,它会在旋转事件循环之前使对话框可见。

您可以自己实现功能等效的 exec(),如下所示:

void myExec(QDialog * dialog) {
  QStateMachine sm;
  QState s1(&sm), s2(&sm);
  sm.setInitialState(&s1);
  QEventTransition transition(dialog, QEvent::Close);
  s2.addTransition(&transition);
  QEventLoop loop;
  QObject::connect(&s2, &QState::entered, &loop, &QEventLoop::quit);
  sm.start();
  dialog->show();
  loop.exec();
}

一般来说,您永远不应该使用 exec() 创建嵌套事件循环,因为您将大量自己的代码暴露给可能的重入要求。在对话框的情况下,总是可以在不使用 exec() 的情况下显示模态对话框,所以真的没有意义。