日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于Qt的事件循环以及QEventLoop的简单使用

發布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Qt的事件循环以及QEventLoop的简单使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 }

/*******************exec,QEventLoop**********/

1、事件循環一般用exec()函數開啟。QApplicaion::exec()、QMessageBox::exec()都是事件循環。其中前者又被稱為主事件循環。

事件循環首先是一個無限“循環”,程序在exec()里面無限循環,能讓跟在exec()后面的代碼得不到運行機會,直至程序從exec()跳出。從exec()跳出時,事件循環即被終止。QEventLoop::quit()能夠終止事件循環。

其次,之所以被稱為“事件”循環,是因為它能接收事件,并處理之。當事件太多而不能馬上處理完的時候,待處理事件被放在一個“隊列”里,稱為“事件循環隊列”。當事件循環處理完一個事件后,就從“事件循環隊列”中取出下一個事件處理之。當事件循環隊列為空的時候,它和一個啥事也不做的永真循環有點類似,但是和永真循環不同的是,事件循環不會大量占用CPU資源。

事件循環的本質就是以隊列的方式再次分配線程時間片。

2、事件循環是可以嵌套的,一層套一層,子層的事件循環執行exec()的時候,父層事件循環就處于中斷狀態;當子層事件循環跳出exec()后,父層事件循環才能繼續循環下去。

另外,子層事件循環具有父層事件循環的幾乎所有功能。Qt會把事件送到當前生效的那個事件循環隊列中去,其中包括Gui的各種事件。所以用戶在主線程中執行各種exec()(如QMessageBox::exec(),QEventLoop::exec())的時候,雖然這些exec()打斷了main()中的QApplication::exec(),但是Gui界面仍然能夠正常響應。 ???

3、如果某個子事件循環仍然有效,但其父循環被強制跳出,此時父循環不會立即執行跳出,而是等待子事件循環跳出后,父循環才會跳出。

總結

以上是生活随笔為你收集整理的关于Qt的事件循环以及QEventLoop的简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 麻豆一区二区三区在线观看 | 18禁裸乳无遮挡啪啪无码免费 | 在线观看国产小视频 | 春色伊人| 精品久久久久一区二区国产 | 成人在线天堂 | av簧片| 日本不卡一区在线观看 | 亚洲AV无码精品色毛片浪潮 | 天天槽 | asian性开放少妇pics | 一道本视频在线 | 日本黄色xxxxx| 四虎影视大全 | 亚洲精品成人片在线观看精品字幕 | 国产二级一片内射视频播放 | 激情久久久 | 日韩精品高清在线 | 亚洲精品白浆 | 国产又粗又硬又长又爽的演员 | 亚洲国产精品久久久久婷婷老年 | 亚洲色图另类小说 | 在线免费视频一区二区 | 日韩国产片 | 成人精品二区 | 无码人妻精品一区二区蜜桃视频 | 五月天综合网站 | 后入内射欧美99二区视频 | 欧美日韩乱国产 | 老司机午夜精品 | 国产经典三级在线 | 特级做a爰片毛片免费69 | www中文字幕在线观看 | 亚洲精品欧美在线 | 亚洲精品视频一区 | 成年人的毛片 | 一二三区不卡 | 成人免费网站在线 | 69综合 | 欧美精品乱码久久久久久 | 美女xx00| www.国产视频 | 成人免费视频一区 | 成人毛片18女人 | 亚洲女人被黑人巨大进入 | 爱的色放韩国电影 | 欧美日韩精品一区 | 亚洲天堂男人 | 老司机成人免费视频 | 免费黄色的网站 | 毛片毛片毛片毛片毛片毛片毛片 | 91色爱| 色综合色综合 | 高跟肉丝丝袜呻吟啪啪网站av | 亚洲免费高清 | 国产1区2区在线观看 | 成人午夜在线观看视频 | 手机在线一区二区三区 | 亚洲综合色在线观看 | 亚洲精品1 | 在线看片中文字幕 | 国产肉体ⅹxxx137大胆 | 亚洲免费视频观看 | 成人性生交大片免费看r链接 | 毛片在线看网站 | 国产精品久久久久久久久久久新郎 | 神宫寺奈绪一区二区三区 | 俄罗斯av在线 | 国产无遮掩 | 欧美一区二区三区成人久久片 | 超碰免费在线观看 | 伊人网影院| 亚洲欧洲国产日韩 | 欧美精品一区二区免费 | 日日碰狠狠添天天爽 | 蜜臀少妇久久久久久久高潮 | 午夜一区在线观看 | 免费在线观看网址 | 一级视频在线观看 | 特级丰满少妇一级aaaa爱毛片 | 国产中文一区二区三区 | 婷婷天堂网 | 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 热热热热色| 欧美福利在线 | 国产传媒av在线 | 日韩精品电影一区 | 深夜老司机福利 | 不卡视频免费在线观看 | 69国产精品视频 | 西西4444www大胆无码 | 欧美一区二区三区大屁股撅起来 | 久久av资源网 | 亚洲涩涩 | 亚洲美免无码中文字幕在线 | 一级美女大片 | 国产这里有精品 | 精品视频一区在线观看 | 青青草草 |