Modal QDialog仍允许定时器调用插槽?

时间:2015-07-17 23:24:36

标签: qt qdialog qtimer

在我的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();

1 个答案:

答案 0 :(得分:0)

  

我想我可以在显示模态对话框之前停止计时器。   但是,可能存在对话框完全不同的情况   班级比计时器。

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

// 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及其使用的事件循环中)并创建自己的复杂对话框类,并为其提供非常具体的事件循环。