【问题标题】:Modal QDialog still allows timers to call slots?Modal QDialog 仍然允许定时器调用槽?
【发布时间】:2015-07-17 23:24:36
【问题描述】:

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

【问题讨论】:

    标签: qt qdialog qtimer


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2014-07-01
      • 1970-01-01
      • 2010-12-18
      • 2016-09-02
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多