Modal QDialog仍然允许计时器调用插槽



在我的Qt程序中,我有模态QDialogs,这意味着停止一切,直到它被解雇后才继续执行代码。它适用于它所在的函数-我在qDialog::exec()之后的下一行代码上放置了一个断点,直到我解散对话框之后才会中断。

然而,有一个QTimer连接到它的超时槽,它将继续走,即使当模态对话框和执行代码在其槽。

我想我可以在显示modal dialog之前停止定时器。然而,在某些情况下,对话框可能与计时器完全不同。是否有一种方法可以真正停止程序的执行,直到QDialog被解除?

的例子:

QTimer* pTestTimer = new QTimer( this );
connect( pTestTimer , SIGNAL( timeout() ), this, SLOT( timerSlot() ) );
//Slot code elsewhere
void cMyClass::deleteMeTimerSlot()
{
    qDebug() << "See me during modal?";
}
//starting a modal dialog
pTestTimer->start( 1000 );
QDialog* pModalDlg = new QDialog( this, Qt::Dialog | Qt::FramelessWindowHint     | Qt::WindowStaysOnTopHint );
pModalDlg->setModal(true);
pMOdalDlg->exec();

exec();

输出仍然显示"See me during modal?"

我想我可以在显示模态对话框之前停止计时器。然而,在某些情况下,对话框可能处于完全不同的状态类比定时器。

是的,你可以在父上下文中操作所有可访问的计时器(看起来你在寻找通用的解决方案)。

// Halt all the timers within parent context.
// If all the timers have parent maybe the top app widget pointer
// should be used for parentObj
QList<QTimer*> listOfTimers = parentObj->findChildren<QTimer*>(
   QString(), Qt::FindChildrenRecursively);
for(QTimer* pTimer : listOfTimers)
   pTimer->stop();

是否有一种方法可以真正停止程序的执行,直到QDialog被解除?

除非你的意思是停止所有线程:不,QDialog是程序的一部分,并不意味着停止任何执行,但模态对话框在自己的事件循环中运行,只阻止用户操作其他程序UI。我想你可以在退出模态对话框后重新启动所有停止的计时器。

pModalDlg->exec();
// restart all the timers within parent context
for(QTimer* pTimer : listOfTimers)
   pTimer->start();

您还可以查看Qt源代码(在QDialog和它使用的事件循环中),并为它创建具有非常特定事件循环的自己的复杂对话框类。

最新更新