3

私の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();

4

1 に答える 1

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 とそれが使用するイベント ループ) を覗いて、非常に特殊なイベント ループを持つ独自の洗練されたダイアログ クラスを作成することもできます。

于 2015-07-18T04:36:44.317 に答える