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()
也是这样做的。如果您还有其他问题,请单独发布。