Qt -- 19模态和非模态对话框
什么是模態和非模態對話框
點不了其他的功能和界面。這種對話框就稱為模態對話框。還有一些能夠操作其他的窗口屬于非模態對話框。
下面新建一個工程,新建好之后,在設計界面中搭建如下圖所示窗體(1、在菜單項中添加文件、編輯的菜單,
2、添加一個工具欄,3、在文件菜單中添加菜單項新建,并把新建放到工具欄中。)
現在,點擊新建按鈕,沒有任何的反應,因此,我們要給它添加功能,當點擊新建按鈕后,跳出一個對話框。這就需要用到信號與槽的機制。
實現模態對話框
在代碼中來實現一下。
創建對話框,需要添加頭文件 #include <QDialog>
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDialog> #include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//點擊新建按鈕,彈出一個對話框connect(ui->actionNew,&QAction::triggered,[=](){//對話框有兩種分類:模態(不可以對其他窗口進行操作)和非模態(可以對其他窗口進行操作)//模態創建QDialog dlg(this);//指定父親,避免手動釋放dlg.exec();//帶有阻塞功能,沒辦法對其他窗口進行操作qDebug() << "模態對話框彈出了";}); }MainWindow::~MainWindow() {delete ui; }運行代碼,點擊新建按鈕。會跳出對話框,如下圖所示。
當出現該對話框后,再想要點擊其他窗口,不可以做到。而且在應用程序輸出窗口也沒有打印出調試信息。這是因為我們創建的對話框是模態對話框,當程序運行后,會被阻塞在
這句代碼,當關閉對話框后,代碼接著往下執行,應用程序輸出窗口才開始輸出調試信息。
此外,還可以指定創建出來的對話框的大小。
還有另外實現模態對話框的方式。
一、
二、
代碼如下,
實現非模態對話框
代碼如下:
//點擊打開按鈕,彈出一個非模態對話框 connect(ui->actionOpen,&QAction::triggered,[=](){QDialog dlg2(this);dlg2.resize(200,200);dlg2.show();qDebug() << "非模態對話框彈出了"; });運行程序,會發現窗體一閃而過。
是因為執行完 dlg2.show(); 這句代碼后,對話框就消失了。本質原因是這個對象被放置在棧上了,我們要把它放置在堆上面。
代碼如下:
//點擊打開按鈕,彈出一個非模態對話框 connect(ui->actionOpen,&QAction::triggered,[=](){QDialog * dlg2 = new QDialog(this);dlg2->resize(200,200);dlg2->show();qDebug() << "非模態對話框彈出了"; });非模態對話框可以對其他窗口進行操作。
雖然利用上述代碼可以實現一個非模態對話框,但是存在以下問題,一是每次點擊都會重新在堆上創建出來一個對話框。
二是關閉對話框并不會釋放堆上面的內存,只有關閉(總)窗體,這些堆上的對象才會釋放。如果一直點下去,就會一直耗費內存資源。
那怎樣解決呢?
可以通過設置這個對象的屬性來解決。需要用到設置屬性函數 setAttribute ,來查看下幫助文檔。
那應該看哪一個下面的 setAttribute 函數介紹呢?我們寫的是對話框,所以應該查看 QDialog 類下面的,但是幫助文檔中并沒有,我們就應該看它父類是誰,
// An highlighted block var foo = 'bar';可知,QDialog 繼承與 QWidget ,所以應該看 QWidget 的 setAttribute 。
窗體的屬性有很多,點 Qt::WidgetAttribute attribute,這一項進去看下(一般這樣的、綠色的就代表著是枚舉值。),
枚舉值有很多,也代表著屬性很多。
這里直接說下應該設置哪個屬性,應該使用值為 55 的那個屬性。
該屬性可以在關閉對話框的時候就將其在堆上的內存給釋放掉。
總結
以上是生活随笔為你收集整理的Qt -- 19模态和非模态对话框的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的个人网站CuteKe
- 下一篇: asp木马常识综合