關於Qt的事件迴圈以及QEventLoop的簡單使用

來源:互聯網
上載者:User

標籤:

1.一般我們的事件迴圈都是由exec()來開啟的,例如下面的例子:

1 QCoreApplicaton::exec()2 QApplication::exec()3 QDialog::exec()4 QThread::exec()5 QDrag::exec()6 QMenu::exec()

  這些都開啟了事件迴圈,事件迴圈首先是一個無限“迴圈”,程式在exec()裡面無限迴圈,能讓跟在exec()後面的代碼得不到運行機會,直至程式從exec()跳出。從exec()跳出時,事件迴圈即被終止。QEventLoop::quit()能夠終止事件迴圈。

  事件迴圈實際上類似於一個事件隊列,對列入的事件依次的進行處理,當時間做完而時間迴圈沒有結束的時候,其實際上比較類似於一個不佔用CPU事件的for(;;)迴圈。

  其本質實際上是以隊列的方式來重新分配時間片。

2.事件迴圈是可以嵌套的,當在子事件迴圈中的時候,父事件迴圈中的事件實際上處於中斷狀態,當子迴圈跳出exec之後才可以執行父迴圈中的事件。當然,這不代表在執行子迴圈的時候,類似父迴圈中的介面響應會被中斷,因為往往子迴圈中也會有父迴圈的大部分事件,執行QMessageBox::exec(),QEventLoop::exec()的時候,雖然這些exec()打斷了main()中的QApplication::exec(),但是由於GUI介面的響應已經被包含到子迴圈中了,所以GUI介面依然能夠得到響應。

3.如果某個子事件迴圈仍然有效,但其父迴圈被強制跳出,此時父迴圈不會立即執行跳出,而是等待子事件迴圈跳出後,父迴圈才會跳出

 

舉幾個例子吧,比如說如果想要將主線程等待100ms,總不能使用sleep吧,那樣會導致GUI介面停止回應的,但是用事件迴圈就可以避免這一點:

1 QEventLoop loop;2 QTimer::singleShot(100, &loop, SLOT(quit()));3 loop.exec();

還有,比如說對於一個槽函數,觸發之後會彈出一個dialog,但是像下面這樣寫的話,視窗會一閃而過的:

1 void ****::mySLot{2     QDialog dlg;3     dlg.show();4 }

當然這裡可以使用將dlg改成一個靜態成員,通過增長期生存期的方法來解決這個問題,但是這裡同樣可以使用eventLoop來解決這個問題:

1 void ****::mySLot{2     QDialog dlg;3     dlg.show();4     QEventLoop loop;5     connect(&dlg, SIGNAL(finished(int)), &loop, SLOT(quit()));6     loop.exec(QEventLoop::ExcludeUserInputEvents);7 }

 

關於Qt的事件迴圈以及QEventLoop的簡單使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.