Qt 模态QDialog仍然允许计时器调用插槽?

Qt 模态QDialog仍然允许计时器调用插槽?,qt,qdialog,qtimer,Qt,Qdialog,Qtimer,在我的Qt程序中,我有modalQDialogs,它意味着停止一切,直到代码被解除后才继续执行代码。它适用于它所在的函数--我在qDialog::exec()之后的下一行代码上放置了一个断点,直到我关闭对话框后它才会中断 但是,有一个QTimer在超时时连接到插槽,即使模式对话框启动并在其插槽中执行代码,它也会继续运行 我想我可以在显示模式对话框之前停止计时器。但是,在某些情况下,对话框与计时器位于完全不同的类中。有没有办法真正停止程序的执行,直到QDialog被解除 例如: QTimer* p

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

但是,有一个
QTimer
在超时时连接到插槽,即使模式对话框启动并在其插槽中执行代码,它也会继续运行

我想我可以在显示
模式对话框之前停止计时器。但是,在某些情况下,对话框与计时器位于完全不同的类中。有没有办法真正停止程序的执行,直到
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();
QTimer*pTestTimer=新的QTimer(此);
连接(pTestTimer,信号(timeout()),此,插槽(timerSlot());
//其他位置的插槽代码
void cMyClass::deleteMeTimerSlot()
{
qDebug()启动(1000);
QDialog*pModalDlg=新的QDialog(这是Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
pModalDlg->setModal(真);
pMOdalDlg->exec();
exec()
中,输出仍然显示“在模式期间查看我?”

我想我可以在显示模式对话框之前停止计时器。 但是,在某些情况下,对话框可能处于完全不同的位置 类比计时器

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

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

// 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();
pModalDlg->exec();

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