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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt5教程(七):模态/非模态对话框

發(fā)布時(shí)間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt5教程(七):模态/非模态对话框 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

模態(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)閉后才釋放:

connect(p2, &QAction::triggered,[=](){QDialog *dialog2 = new QDialog(this);dialog2->show();qDebug() << "11111";}

我們發(fā)現(xiàn). 非模態(tài)對話框出現(xiàn), "11111"也打印出來了


但是這樣使用new的方法, 在主對話框關(guān)閉后才釋放空間, 如果我們會多次使用該菜單項(xiàng)創(chuàng)建對話框, 會占用大量內(nèi)存空間, 所以更好的方式是, 不給該會話框指定父對象, 并設(shè)置在該對話框關(guān)閉后自動(dòng)釋放空間:?

connect(p2, &QAction::triggered,[=](){QDialog *dialog2 = new QDialog;dialog2->setAttribute(Qt::WA_DeleteOnClose);dialog2->show();qDebug() << "11111";});

附錄

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。