如何在 Qt 中使用 QTimer singleShot 和 QEventLoop
How to use QTimer singleShot with QEventLoop in Qt
我需要使用 QTimer singleShot 打开 QDialog 并等待状态标志。如果此变量为真,则继续。
这是我的代码
StatusFlag = FALSE;
void MainWindow::OpenWindow()
{
qDebug("OpenWindow");
NewGUI *gui=new NewGUI();
gui->setModal(true);
gui->exec();
}
void MainWindow::mWait(ulong milliSeconds)
{
QEventLoop loop;
QTimer::singleShot(milliSeconds, &loop, SLOT(quit()));
loop.exec();
}
In NewGUI constructor StatusFlag is set to TRUE
QTimer::singleShot(0, this, SLOT(OpenWindow()));
while(StatusFlag == FALSE)
{
//Wait until StatusFlag is TRUE.
qDebug("Enter");
mWait(1);
qDebug("Exit");
}
if(StatusFlag == TRUE)
{
//Do something
qDebug("Do something");
}
当前输出是
Enter
OpenWindow
预期输出为
Enter
Exit
OpenWindow
Do something
如果我注释行
QTimer::singleShot(0, this, SLOT(OpenWindow()));
那么输出就是
Enter
Exit.. still continuing
你有什么建议吗?
在您的代码中,gui->exec();
启动了一个新的本地事件循环,因此您永远不会退出 OpenWindow()
。因此,您的 while 循环将阻塞 mWait(1);
,直到您关闭对话框。
您可以在 NewGUI 构造函数中发出信号,而不是设置标志,您可以将 MainWindow 的插槽连接到该信号。你可以在这个槽位做任何你需要做的工作。
我需要使用 QTimer singleShot 打开 QDialog 并等待状态标志。如果此变量为真,则继续。
这是我的代码
StatusFlag = FALSE;
void MainWindow::OpenWindow()
{
qDebug("OpenWindow");
NewGUI *gui=new NewGUI();
gui->setModal(true);
gui->exec();
}
void MainWindow::mWait(ulong milliSeconds)
{
QEventLoop loop;
QTimer::singleShot(milliSeconds, &loop, SLOT(quit()));
loop.exec();
}
In NewGUI constructor StatusFlag is set to TRUE
QTimer::singleShot(0, this, SLOT(OpenWindow()));
while(StatusFlag == FALSE)
{
//Wait until StatusFlag is TRUE.
qDebug("Enter");
mWait(1);
qDebug("Exit");
}
if(StatusFlag == TRUE)
{
//Do something
qDebug("Do something");
}
当前输出是
Enter
OpenWindow
预期输出为
Enter
Exit
OpenWindow
Do something
如果我注释行
QTimer::singleShot(0, this, SLOT(OpenWindow()));
那么输出就是
Enter
Exit.. still continuing
你有什么建议吗?
在您的代码中,gui->exec();
启动了一个新的本地事件循环,因此您永远不会退出 OpenWindow()
。因此,您的 while 循环将阻塞 mWait(1);
,直到您关闭对话框。
您可以在 NewGUI 构造函数中发出信号,而不是设置标志,您可以将 MainWindow 的插槽连接到该信号。你可以在这个槽位做任何你需要做的工作。