QEventLoop的简单使用(一)
1.一般我們的事件循環(huán)都是由exec()來開啟的,例如下面的例子:
QCoreApplicaton::exec()QApplication::exec()QDialog::exec()QThread::exec()QDrag::exec()QMenu::exec()這些都開啟了事件循環(huán),事件循環(huán)首先是一個無限“循環(huán)”,程序在exec()里面無限循環(huán),能讓跟在exec()后面的代碼得不到運行機會,直至程序從exec()跳出。從exec()跳出時,事件循環(huán)即被終止。QEventLoop::quit()能夠終止事件循環(huán)。
事件循環(huán)實際上類似于一個事件隊列,對列入的事件依次的進行處理,當時間做完而時間循環(huán)沒有結(jié)束的時候,其實際上比較類似于一個不占用CPU事件的for(;;)循環(huán)。
其本質(zhì)實際上是以隊列的方式來重新分配時間片。
2.事件循環(huán)是可以嵌套的,當在子事件循環(huán)中的時候,父事件循環(huán)中的事件實際上處于中斷狀態(tài),當子循環(huán)跳出exec之后才可以執(zhí)行父循環(huán)中的事件。當然,這不代表在執(zhí)行子循環(huán)的時候,類似父循環(huán)中的界面響應會被中斷,因為往往子循環(huán)中也會有父循環(huán)的大部分事件,執(zhí)行QMessageBox::exec(),QEventLoop::exec()的時候,雖然這些exec()打斷了main()中的QApplication::exec(),但是由于GUI界面的響應已經(jīng)被包含到子循環(huán)中了,所以GUI界面依然能夠得到響應。
3.如果某個子事件循環(huán)仍然有效,但其父循環(huán)被強制跳出,此時父循環(huán)不會立即執(zhí)行跳出,而是等待子事件循環(huán)跳出后,父循環(huán)才會跳出
舉幾個例子吧,比如說如果想要將主線程等待100ms,總不能使用sleep吧,那樣會導致GUI界面停止響應的,但是用事件循環(huán)就可以避免這一點:
QEventLoop loop;QTimer::singleShot(100, &loop, SLOT(quit()));loop.exec();還有,比如說對于一個槽函數(shù),觸發(fā)之后會彈出一個dialog,但是像下面這樣寫的話,窗口會一閃而過的:
void ****::mySLot{QDialog dlg;dlg.show();}當然這里可以使用將dlg改成一個靜態(tài)成員,通過增長期生存期的方法來解決這個問題,但是這里同樣可以使用eventLoop來解決這個問題:
void ****::mySLot{QDialog dlg;dlg.show();QEventLoop loop;connect(&dlg, SIGNAL(finished(int)), &loop, SLOT(quit()));loop.exec(QEventLoop::ExcludeUserInputEvents); }本文轉(zhuǎn)自:關(guān)于Qt的事件循環(huán)以及QEventLoop的簡單使用 - eversliver - 博客園關(guān)于Qt的事件循環(huán)以及QEventLoop的簡單使用 - eversliver - 博客園 (cnblogs.com)https://www.cnblogs.com/-wang-cheng/p/4973021.html
總結(jié)
以上是生活随笔為你收集整理的QEventLoop的简单使用(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 抖音照片速度怎么加快(抖音直播电脑版)
- 下一篇: 笔记本如何禁用自带键盘(怎样在外接键盘时
