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