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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中为自己的程序建立一个消息循环

發(fā)布時(shí)間:2023/12/18 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中为自己的程序建立一个消息循环 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 一般事件循環(huán)都是由exec()來開啟的,如:

QCoreApplicaton::exec() QApplication::exec() QDialog::exec() QThread::exec() QDrag::exec() QMenu::exec()
  • 事件循環(huán)是一個(gè)無限循環(huán),程序在exec()里面無限循環(huán),能讓跟在exec()后面的代碼得不到運(yùn)行的機(jī)會(huì),直到exec()跳出。從exec()中跳出時(shí),事件循環(huán)會(huì)被終止。QEventLoop::quit()能夠終止事件循環(huán)。事件循環(huán)實(shí)際上類似于一個(gè)事件隊(duì)列,對(duì)列入的事件依次的進(jìn)行處理,當(dāng)時(shí)間做完而事件循環(huán)沒有結(jié)束的時(shí)候,其實(shí)際上比較類似于一個(gè)不占用CPU事件的for(;;)循環(huán)。
  • 事件循環(huán)是可以嵌套的,當(dāng)在子事件循環(huán)中的時(shí)候,父事件循環(huán)中的事件實(shí)際上是處于中斷的狀態(tài),當(dāng)子循環(huán)跳出exec()之后才可以執(zhí)行父循環(huán)中的事件。但是此時(shí)并不代表父循環(huán)中的界面響應(yīng)會(huì)被中斷,因?yàn)橥友h(huán)中也會(huì)有父循環(huán)的大部分事件,執(zhí)行QMessageBox::exec(),QEventLoop::exec()的時(shí)候,雖然這些exec()打斷了main函數(shù)中的QApplication::exec(),但是由于GUI界面的響應(yīng)已經(jīng)被包含在子循環(huán)當(dāng)中,所以GUI界面依然能夠得到響應(yīng)。
  • 如果某一個(gè)子事件的循環(huán)仍然有效,但是其父循環(huán)被強(qiáng)制跳出,此時(shí)父循環(huán)不會(huì)立即執(zhí)行跳出,而是等待子事件循環(huán)跳出后,父循環(huán)才會(huì)跳出。

如果希望將主線程等待100ms,不能使用sleep來完成這個(gè)過程,那樣會(huì)導(dǎo)致GUI界面停止響應(yīng)。但是利用事件循環(huán)就可以避免這一點(diǎn):

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

若在一個(gè)槽函數(shù)中創(chuàng)建一個(gè)對(duì)象如下:

void myDialog:: on_pushButton_clicked() {QDialog dlg;dlg.show(); }

此時(shí)我們會(huì)看不到dlg窗口或者是看到窗口一閃而過。因?yàn)槲覀兊膁lg會(huì)因?yàn)槌隽俗饔糜蚨晃鰳?gòu)掉。解決的辦法很簡單。

  • 將 dlg 作為類的成員,而不是函數(shù)的局部變量
  • 將 dlg 前添加static作為靜態(tài)成員
  • 將 dlg 用new分配到heap當(dāng)中
  • 使用事件循環(huán)
  • void myDialog::on_pushButton_clicked() {QDialog tDlg;tDlg.show();QEventLoop tloop;connect(&tDlg,SIGNAL(finished(int)),&tloop,SLOT(quit()));tloop.exec(QEventLoop::AllEvents); }

    總結(jié)

    以上是生活随笔為你收集整理的Qt中为自己的程序建立一个消息循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。