QTスロット関数使用記録——進捗バーポップアップイベント

1732 ワード

評価ソフトウェアbenchmarkを開発する過程で、テストウィンドウで異なるテスト項目を選択し、テストボタンをクリックすると、システムが新しいウィンドウをポップアップし、ウィンドウの2つの進捗バーが更新されます(単一の進捗バーは上、総評価進捗バーは下).
最初は、テストボタンのスロット関数で進捗バーウィンドウshowを呼び出し、進捗バー更新関数を呼び出します.簡単に言えば、
void slotFunc(){
    progressWin->show();
    testClass->testStart();     //  testClass->testStart() calls progresswin->progressUpdate();
}

しかし、このような結果、フォームがポップアップされると、進捗バーは表示されず、同時に進捗バー更新の関数が機能し続け、qt creatorのlogからvalue値が100%進捗バーまで更新され続けていることがわかります.次の図に示します.
そして、私はprogresswin->progressUpdate();は別の信号送信となり、progressUpdateのスロット関数をトリガするか、または、テストボタンのclick信号は2つのスロット関数show()に対応し、progressUpdate()となる.彼らの効果は同じだ.
1つの信号は複数のスロット関数に対応できるが,実行の順序と効果は保障されていない.信号とスロットに関する動作メカニズムをもっと読んだ後、信号が1つのスロット関数に対応し、1つのスロット関数が1つの機能しか完成していないことに気づいた.
そこで、私は案をこのように変えました.
void slotFunc(){
progressWin->show();

timer->setSingleShot(true);
timer->start(10);
// testStart() calls progressUpdate()
connect(timer,SIGNAL(timeout()),progressWin,SLOT(testClass->testStart());
}

私がこの問題を解決して間もなく、私の同僚は彼の案を提出しました:testClassにQThreadを継承させ、testStartを書き込みますvirtual void run();でテストボタンのclick関数でtestClassのstart()[slot] void QThread::start(Priority priority = InheritPriority) .これによりrun関数スレッドが呼び出され,これは別の形式のトリガとなる.同じ効果を達成した.