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

Qt 如何获得QDialog::show()的结果?,qt,exec,show,Qt,Exec,Show,我想在我的项目中将exec用法转换为show方法。因为,当我对窗口(对话框)使用exec时,我无法打开另一个窗口。这是exec()和show()方法之间的基本区别 exec和show以不同的方式工作,我想知道如何使用show()而不是exec()来更改下面的代码 例如: int result = exampleWindow->exec(); if ( result == QDialogButtonBox::Ok ) { exampleWindow->UpdateCalibr

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

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

例如:

int result = exampleWindow->exec();

if ( result == QDialogButtonBox::Ok )
{
    exampleWindow->UpdateCalibrationData(&data);
    exampleWindow->UpdateFilterData(&filterData);
    exampleWindow();
}
exec()方法显示所述的模式对话框

您可以使用对话框的示例。您可以在其中写下如下内容:

void ExmpleWin::closeEvent(QCloseEvent *event)
{
    if (/*Your condition*/) {
        emit signalUpdateMyData();
        event->accept();
    }
}
此外,您还必须将signal signalUpdateMyData()与适当的插槽连接,以便:

exampleWindow->UpdateCalibrationData(&data);
exampleWindow->UpdateFilterData(&filterData);
exampleWindow();
exec()方法显示所述的模式对话框

您可以使用对话框的示例。您可以在其中写下如下内容:

void ExmpleWin::closeEvent(QCloseEvent *event)
{
    if (/*Your condition*/) {
        emit signalUpdateMyData();
        event->accept();
    }
}
此外,您还必须将signal signalUpdateMyData()与适当的插槽连接,以便:

exampleWindow->UpdateCalibrationData(&data);
exampleWindow->UpdateFilterData(&filterData);
exampleWindow();
show()
显示非模式窗口

exec()
显示一个模式窗口

如果要获得
show()
的结果,请使用Qt信号/插槽:

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()));
}
主窗口.h

class MainWindow : public QMainWindow {
    Q_OBJECT
private slots:
    void updateData();
}
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();
}
主窗口.cpp

class MainWindow : public QMainWindow {
    Q_OBJECT
private slots:
    void updateData();
}
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()
显示非模式窗口

exec()
显示一个模式窗口

如果要获得
show()
的结果,请使用Qt信号/插槽:

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()));
}
主窗口.h

class MainWindow : public QMainWindow {
    Q_OBJECT
private slots:
    void updateData();
}
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();
}
主窗口.cpp

class MainWindow : public QMainWindow {
    Q_OBJECT
private slots:
    void updateData();
}
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()
只是使对话框窗口可见。这是一种
QWidget
方法

exec()
在类中提供时,始终旋转事件循环。特别是对于对话框,它将在旋转事件循环之前使对话框可见

您可以自己实现功能等效的
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()
的情况下显示模式对话框,因此它实际上没有意义。

show()
只是使对话框窗口可见。这是一种
QWidget
方法

exec()
在类中提供时,始终旋转事件循环。特别是对于对话框,它将在旋转事件循环之前使对话框可见

您可以自己实现功能等效的
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()
的情况下显示模式对话框,因此没有任何意义。

谢谢您的回答。我有一个问题要问你们,使用相同的时间执行和显示方法是否安全。例如,首先使用show,然后使用exec作为循环?你认为呢?同时使用
exec()
show()
有什么意义?如果您的意思是针对不同的情况交替使用这两种方法,那么是的,从技术上讲是安全的(不过要小心,因为
exec()
的信号也会被触发)。但是我不知道为什么需要
exec()
的循环。谢谢您的回答。我有一个问题要问你们,使用相同的时间执行和显示方法是否安全。例如,首先使用show,然后使用exec作为循环?你认为呢?同时使用
exec()
show()
有什么意义?如果您的意思是针对不同的情况交替使用这两种方法,那么是的,从技术上讲是安全的(不过要小心,因为
exec()
的信号也会被触发)。但是我不知道为什么需要
exec()
的循环。您好,谢谢您的回答。这对我来说是一个很好的解决方案,但我有一个问题要问你,循环在应用程序关闭时终止。但是我想在QDialog关闭时终止循环。我该怎么做?@EmreS答案中的
exec()
就是这样做的,而
QDialog::exec()
也是这样做的。如果您还有其他问题,请单独发布。您好,谢谢您的回答。这对我来说是一个很好的解决方案,但我有一个问题要问你,循环在应用程序关闭时终止。但是我想在QDialog关闭时终止循环。我该怎么做?@EmreS答案中的
exec()
就是这样做的,而
QDialog::exec()
也是这样做的。如果您还有其他问题,请单独发布。