Qt專欄之模態(tài)與非模態(tài)對話框的實現(xiàn)
一、概念介紹
什么是模態(tài)對話框和非模態(tài)對話框呢?我們?nèi)粘J褂密浖^程中很常見的現(xiàn)象,點擊某個軟件上某個按鈕會彈出對話框窗口,此時對于其他窗口而言:
可以同時對其他窗口進(jìn)行操作的稱為非模態(tài);
不可以同時,只能操作當(dāng)前彈出的窗口的稱為模態(tài)。
二、代碼示例
2.1模態(tài)對話框示例代碼
/*在主類對象的構(gòu)造函數(shù)中我們新建一個按鈕用于彈出對話框*/
QPushButton *btn = new QPushButton("new",this);
/*信號與槽的連接
槽函數(shù)通過Lambda表達(dá)式實現(xiàn)
主要功能實現(xiàn)了點擊一個new按鈕,彈出一個模態(tài)對話框
*/
connect(btn,&QPushButton::clicked,[=](){
QDialog dlg(this) ;
dlg.exec();
});
注意包含頭文件QPushButton以及QDialog

2.2非模態(tài)對話框示例代碼
/*在主類對象的構(gòu)造函數(shù)中我們新建一個按鈕用于彈出對話框*/
QPushButton *btn = new QPushButton("new",this);
/*信號與槽的連接,槽函數(shù)通過Lambda表達(dá)式實現(xiàn)
主要功能實現(xiàn)了點擊一個new按鈕,彈出一個非模態(tài)對話框
*/
connect(btn,&QPushButton::clicked,[=](){
QDialog *dlg = new QDialog(this) ;
dlg->show();
});
很好奇,為什么是對話框,上面模態(tài)直接
QDialog dlg(this);而非模態(tài)就需要new呢?那是因為構(gòu)造函數(shù)中在棧中聲明定義的變量在構(gòu)造函數(shù)運行完成后,就會被回收。因此,new一個對象實例,利用堆上的空間即可,可以試試兩種實現(xiàn)效果的不同,這邊我們演示的效果如下:

三、非模態(tài)下的內(nèi)存泄漏隱患
假設(shè)一下,在我們上述的非模態(tài)場景下,點擊按鈕new一個對象示例后,我們關(guān)掉對話框,由于使用堆空間,只要主窗口QObject未被析構(gòu)回收內(nèi)存,繼續(xù)點擊按鈕就會又創(chuàng)建一個新的對象實例,循環(huán)反復(fù)一直創(chuàng)建到達(dá)一定數(shù)量級,就會導(dǎo)致堆溢出。
解決辦法就是使用setAttribute()設(shè)置屬性函數(shù),設(shè)置屬性值Qt::WA_DeleteOnClose,意思就是當(dāng)彈出的非模態(tài)對話框關(guān)閉,既刪除該對象內(nèi)存,以上面的例子添加如下代碼:
dlg->setAttribute(Qt::WA_DeleteOnClose);
四、標(biāo)準(zhǔn)對話框
標(biāo)準(zhǔn)對話框:Qt內(nèi)置了一系列對話框,用于簡化開發(fā)。事實上,有很多對話框都是通用的,比如打開文件、設(shè)置顏色、打印設(shè)置等。這些對話框在所有程序中幾乎相同,因此沒有必要在每一個程序中都自己實現(xiàn)這么一個對話框。
Qt 的內(nèi)置對話框大致分為以下幾類:
- QColorDialog:選擇顏色;
- QFileDialog:選擇文件或者目錄;
- QFontDialog:選擇字體;
- QInputDialog:允許用戶輸入一個值,并將其值返回;
- QMessageBox:模態(tài)對話框,用于顯示信息、詢問問題等;
- QPageSetupDialog:為打印機提供紙張相關(guān)的選項;
- QPrintDialog:打印機配置;
- QPrintPreviewDialog:打印預(yù)覽;
- QProgressDialog:顯示操作過程。
到此這篇關(guān)于Qt專欄之模態(tài)與非模態(tài)對話框的實現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 模態(tài)與非模態(tài)對話框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++基于Boost.Asio實現(xiàn)端口映射器的過程詳解
Boost.Asio 是一個功能強大的 C++ 庫,用于異步編程和網(wǎng)絡(luò)編程,它提供了跨平臺的異步 I/O 操作,在這篇文章中,我們將深入分析一個使用 Boost.Asio 實現(xiàn)的簡單端口映射服務(wù)器,文中有詳細(xì)的代碼講解,需要的朋友可以參考下2023-11-11
解析C++編程中的選擇結(jié)構(gòu)和switch語句的用法
這篇文章主要介紹了解析C++編程中的選擇結(jié)構(gòu)和switch語句的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
C語言 詳細(xì)解析時間復(fù)雜度與空間復(fù)雜度
算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度。其作用: 時間復(fù)雜度是度量算法執(zhí)行的時間長短;而空間復(fù)雜度是度量算法所需存儲空間的大小2022-04-04
Visual?Studio配置靜態(tài)庫詳細(xì)步驟和關(guān)鍵配置項
這篇文章主要介紹了Visual?Studio配置靜態(tài)庫的詳細(xì)步驟和關(guān)鍵配置項的相關(guān)資料,靜態(tài)庫是一系列預(yù)先編譯好的目標(biāo)文件(.o文件或.obj文件)的集合,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-12-12
C++如何調(diào)用opencv完成運動目標(biāo)捕捉詳解
OpenCV作為機器視覺開源庫,使用起來非常不錯,這篇文章主要給大家介紹了關(guān)于C++如何調(diào)用opencv完成運動目標(biāo)捕捉的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
解析C++編程中如何使用設(shè)計模式中的狀態(tài)模式結(jié)構(gòu)
這篇文章主要介紹了如何在C++編程中適用設(shè)計模式中的狀態(tài)模式結(jié)構(gòu),狀態(tài)模式強調(diào)將特定狀態(tài)相關(guān)的邏輯分散到一些類的狀態(tài)類中,需要的朋友可以參考下2016-03-03
簡單了解C語言中直接插入排序與直接選擇排序?qū)崿F(xiàn)
這篇文章主要介紹了C語言中直接插入排序與直接選擇排序?qū)崿F(xiàn),插入排序的基本操作就是將一個數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個新的、個數(shù)加一的有序數(shù)據(jù),需要的朋友可以參考下2016-03-03

