如何在 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 的插槽连接到该信号。你可以在这个槽位做任何你需要做的工作。