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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

show()和exec()的区别

發(fā)布時間:2025/3/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 show()和exec()的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

QDialog的顯示有兩個函數(shù)show()和exec()。他們的區(qū)別在參考文檔上的解釋如下:

show():
顯示一個非模式對話框。控制權(quán)即刻返回給調(diào)用函數(shù)。
彈出窗口是否模式對話框,取決于modal屬性的值。
(原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code.?
The dialog will be modal or modeless according to the value of the modal property. )

exec():
顯示一個模式對話框,并且鎖住程序直到用戶關(guān)閉該對話框為止。函數(shù)返回一個DialogCode結(jié)果。
在對話框彈出期間,用戶不可以切換同程序下的其它窗口,直到該對話框被關(guān)閉。
(原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result.?
Users cannot interact with any other window in the same application until they close the dialog. )

先簡單說一下我對模式和非模式對話框的一點點理解:
模式對話框,就是在彈出窗口的時候,整個程序就被鎖定了,處于等待狀態(tài),直到對話框被關(guān)閉。這時往往是需要對話框的返回值進(jìn)行下面的操作。如:確認(rèn)窗口(選擇“是”或“否”)。
非模式對話框,在調(diào)用彈出窗口之后,調(diào)用即刻返回,繼續(xù)下面的操作。這里只是一個調(diào)用指令的發(fā)出,不等待也不做任何處理。如:查找框。

從字面上看,show()即可以顯示非模式也可以顯示模式對話框(設(shè)置modal值)。當(dāng)modal=true的時候是否跟exec()就一樣了呢?
經(jīng)過測試,還是有區(qū)別的。
使用show(),雖然在對話框彈出的時候,程序的其它操作(按鈕、窗口切換等)都失效了;但是程序仍然在調(diào)用對話框之后,馬上返回繼續(xù)執(zhí)行后面的代碼。這樣,你就不會得到窗口的返回值。以這個來看,show()只能算是“半模式”。
而使用exec(),在調(diào)用之后,程序就被鎖定在原地。等待窗口的關(guān)閉。

實際上,QDialog的show()函數(shù)來自其父類QWidget。而exec()則是自己的。

我最近特別喜歡繼承QWidget類來做彈出窗口,它的好處就是方便、靈活,既可以做為彈出窗口用也可以嵌入另外的頁面里(QDialog是不行的)。但問題是,QWidget沒有exec()函數(shù)。所以想彈出這樣模擬出來的模式對話框就不行了。
也查過一些資料,有說用while(true)循環(huán)的,有說用接收事件的,但都感覺不太好。

所以,目前還沒有找到比較好的解決辦法。

續(xù):
上面遺留的問題經(jīng)過查看QTE源代碼(沒有找到QT的)總算解決了。
我查看了QDialog類的exec()函數(shù)。發(fā)現(xiàn)里面同樣調(diào)用了show(),只是在后面又調(diào)用了一句qApp->enter_loop()嵌套一個新的消息循環(huán)來阻塞當(dāng)前事件的執(zhí)行;然后在hide()函數(shù)里調(diào)用了qApp->exit_loop()來退出當(dāng)前的消息循環(huán)并繼續(xù)執(zhí)行原事件。

到QT幫助里查了一下這兩個函數(shù),解釋如下:
enter_loop():
這個函數(shù)被廢棄了。它仍然被保留下來是為了使舊的代碼能夠繼續(xù)工作。我們強烈建議不要在新寫的代碼里使用它。這個函數(shù)直接介入主消息循環(huán)里(遞歸地)。除非你真的知道你在做什么,否則不要調(diào)用它。建議使用:QApplication::eventLoop()->enterLoop()。
exit_loop():
同樣被廢棄了。建議使用:QApplication::eventLoop()->exitLoop()。
提醒:這兩個操作都會進(jìn)入主消息循環(huán),慎用!

那就按照建議的做吧,反正效果都是一樣的。修改原來的自定義窗口,在里面增加了兩個函數(shù),分別實現(xiàn)打開和關(guān)閉窗口,封裝了eventLoop()的調(diào)用。代碼如下:
#include <qapplication.h>
#include <qeventloop.h>
/*模擬QDialog::exec(),以模式對話框方式顯示*/
void MyWidget::doExec()
{
??? this->show();
??? in_loop = TRUE;
??? //qApp->enter_loop();
??? QApplication::eventLoop()->enterLoop();
}
/*關(guān)閉窗口*/
void MyWidget::doClose()
{
??? if ( in_loop ) {
in_loop = FALSE;
//qApp->exit_loop();
??????? QApplication::eventLoop()->exitLoop();
??? }
??? this->close();
}

來源:點擊打開鏈接

總結(jié)

以上是生活随笔為你收集整理的show()和exec()的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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