Qt5教程(七):模态/非模态对话框
模態對話框就是在其沒有被關閉之前,用戶不能與同一個應用程序的其他窗口進行交互,直到該對話框關閉。
非模態對話框就是在被打開時,用戶既可選擇和該對話框進行交互,也可以選擇同應用程序的其他窗口交互。
1. 新建工程
本文福利, 免費領取Qt開發學習資料包、技術視頻,內容包括(C++語言基礎,Qt編程入門,QT圖像,QT網絡,QT數據庫編程,QT項目實戰,QT嵌入式開發,Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點擊免費領取↓↓
2. 添加菜單欄
創建"Dialog"菜單, 添加一個"模態對話框"項和"非模塊對話框項":
QMenuBar *menuBr = menuBar(); setMenuBar(menuBr); QMenu *pDialog = menuBr->addMenu("Dialog"); QAction *p1 = pDialog->addAction("模態對話框"); QAction *p2 = pDialog->addAction("非模態對話框");?
3. 創建模態對話框
包含頭文件
#include <QDialog> #include <QDebug>點擊菜單項創建模態對話框:
connect(p1, &QAction::triggered,[=](){QDialog dialog1;dialog1.exec();qDebug() << "11111";});運行后點擊菜單下的"模態對話框對話框, 會彈出新的一個空白窗口, 但是"11111"沒有輸出:
在關閉模態對話框后, "11111"才輸出.
4. 創建非模態對話框
connect(p2, &QAction::triggered,[=](){QDialog dialog2;dialog2.show();qDebug() << "11111";}保存運行后, 點擊菜單欄下的"非模態對話框", "11111"打印出來了, 但是對話框不見了. 這是因為, 當show();不會阻塞, 在匿名函數運行完后, dialog2就被回收了, 窗口自然就消失了.
為了解決這個問題, 我們只需要把QDialog dialog2;這句定義搬到匿名函數外面, 讓dialog2作為主窗口的成員函數, 這樣匿名函數運行完就不會回收掉dialog2了.
還有一種方法是, 使用new分配空間, 這樣會在主對話框關閉后才釋放:
我們發現. 非模態對話框出現, "11111"也打印出來了
但是這樣使用new的方法, 在主對話框關閉后才釋放空間, 如果我們會多次使用該菜單項創建對話框, 會占用大量內存空間, 所以更好的方式是, 不給該會話框指定父對象, 并設置在該對話框關閉后自動釋放空間:?
附錄
mainwindow.cpp
#include "mainwindow.h" #include <QMenuBar> #include <QMenu> #include <QAction> #include <QDialog> #include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {QMenuBar *menuBr = menuBar();setMenuBar(menuBr);QMenu *pDialog = menuBr->addMenu("Dialog");QAction *p1 = pDialog->addAction("模態對話框");QAction *p2 = pDialog->addAction("非模態對話框");connect(p1, &QAction::triggered,[=](){QDialog dialog1;dialog1.exec();qDebug() << "11111";});connect(p2, &QAction::triggered,[=](){QDialog *dialog2 = new QDialog;dialog2->setAttribute(Qt::WA_DeleteOnClose);dialog2->show();qDebug() << "11111";});}MainWindow::~MainWindow() {}本文福利, 免費領取Qt開發學習資料包、技術視頻,內容包括(C++語言基礎,Qt編程入門,QT圖像,QT網絡,QT數據庫編程,QT項目實戰,QT嵌入式開發,Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點擊免費領取↓↓?
總結
以上是生活随笔為你收集整理的Qt5教程(七):模态/非模态对话框的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动驾驶车辆运动规划综述-2015
- 下一篇: 适合C语言的代码编辑器(阅读软件)