如何得到QDialog::show()的结果?
How to get the result of QDialog::show()?
我想在我的项目中将 exec
用法转换为 show
方法。因为,当我将 exec
用于 windows(对话框)时,我无法打开另一个 window。这是 exec()
和 show()
方法之间的基本区别。
exec
和 show
以不同的方式工作,我想知道如何使用 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()
的情况下显示模态对话框,所以真的没有意义。
我想在我的项目中将 exec
用法转换为 show
方法。因为,当我将 exec
用于 windows(对话框)时,我无法打开另一个 window。这是 exec()
和 show()
方法之间的基本区别。
exec
和 show
以不同的方式工作,我想知道如何使用 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()
的情况下显示模态对话框,所以真的没有意义。