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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Qt -- 19模态和非模态对话框

發布時間:2024/1/1 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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; }

運行代碼,點擊新建按鈕。會跳出對話框,如下圖所示。

當出現該對話框后,再想要點擊其他窗口,不可以做到。而且在應用程序輸出窗口也沒有打印出調試信息。這是因為我們創建的對話框是模態對話框,當程序運行后,會被阻塞在

dlg.exec();//帶有阻塞功能,沒辦法對其他窗口進行操作

這句代碼,當關閉對話框后,代碼接著往下執行,應用程序輸出窗口才開始輸出調試信息。

此外,還可以指定創建出來的對話框的大小。

//點擊新建按鈕,彈出一個對話框 connect(ui->actionNew,&QAction::triggered,[=](){//對話框有兩種分類:模態(不可以對其他窗口進行操作)和非模態(可以對其他窗口進行操作)//模態創建QDialog dlg(this);//指定父親,避免手動釋放dlg.resize(200,200);dlg.exec();//帶有阻塞功能,沒辦法對其他窗口進行操作qDebug() << "模態對話框彈出了"; });

還有另外實現模態對話框的方式。
一、

二、

代碼如下,

this->setWindowModality(Qt::ApplicationModal);

實現非模態對話框

代碼如下:

//點擊打開按鈕,彈出一個非模態對話框 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模态和非模态对话框的全部內容,希望文章能夠幫你解決所遇到的問題。

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