Qt中为自己的程序建立一个消息循环
生活随笔
收集整理的這篇文章主要介紹了
Qt中为自己的程序建立一个消息循环
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 一般事件循環都是由exec()來開啟的,如:
- 事件循環是一個無限循環,程序在exec()里面無限循環,能讓跟在exec()后面的代碼得不到運行的機會,直到exec()跳出。從exec()中跳出時,事件循環會被終止。QEventLoop::quit()能夠終止事件循環。事件循環實際上類似于一個事件隊列,對列入的事件依次的進行處理,當時間做完而事件循環沒有結束的時候,其實際上比較類似于一個不占用CPU事件的for(;;)循環。
- 事件循環是可以嵌套的,當在子事件循環中的時候,父事件循環中的事件實際上是處于中斷的狀態,當子循環跳出exec()之后才可以執行父循環中的事件。但是此時并不代表父循環中的界面響應會被中斷,因為往往子循環中也會有父循環的大部分事件,執行QMessageBox::exec(),QEventLoop::exec()的時候,雖然這些exec()打斷了main函數中的QApplication::exec(),但是由于GUI界面的響應已經被包含在子循環當中,所以GUI界面依然能夠得到響應。
- 如果某一個子事件的循環仍然有效,但是其父循環被強制跳出,此時父循環不會立即執行跳出,而是等待子事件循環跳出后,父循環才會跳出。
如果希望將主線程等待100ms,不能使用sleep來完成這個過程,那樣會導致GUI界面停止響應。但是利用事件循環就可以避免這一點:
QEventLoop loop; QTimer::singleShot(100,&loop,SLOT(quit())); loop.exec();若在一個槽函數中創建一個對象如下:
void myDialog:: on_pushButton_clicked() {QDialog dlg;dlg.show(); }此時我們會看不到dlg窗口或者是看到窗口一閃而過。因為我們的dlg會因為出了作用域而被析構掉。解決的辦法很簡單。
總結
以上是生活随笔為你收集整理的Qt中为自己的程序建立一个消息循环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt中事件循环机制详解
- 下一篇: Apache RocketMQ 安装、测