当前位置:网站首页>【QT】窗口的显示与模态窗口
【QT】窗口的显示与模态窗口
2022-08-09 14:59:00 【Small-K】
1.显示窗口
我们知道,在QT里,只要创建一个窗口的类,再调用QWidget基类的.show()方法就可以使一个窗口显示。
以QWidget类来作说明
/* MyWidget.cpp 主类的实现*/
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
#include<windows.h>
#include<QDebug>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog dialog(this); //实例化一个QWidget对象
dialog.show(); //调用show函数使其显示
}
MyWidget::~MyWidget()
{
delete ui;
}
执行一下看效果:

可以看到,主窗口之前,有一个小窗口一闪而过,最后只剩下主窗口还在显示。
很明显,QDialog对象只存在了一瞬间,让我们分析一下原因。
/*main.cpp 程序运行入口*/
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w; //先实例化主窗口
w.show(); //再显示
return a.exec();
}
原来在程序的主入口中,是先实例化主窗口,再进行主窗口的显示。这样就导致,要等到主窗口类的构造函数执行完毕后,才能显示主窗口。
而QWidget定义在主窗口的构造函数中,对象的实例化过程一完成,构造函数的栈区就消失了,QWidget也就跟着没了。
那么就有两种解决方案:
1.为QWidget 加一个.exec()循环方法 (但这样会使得构造函数一直进行,只有关闭了QDialog 后才能完成构造,从而显示主窗口。)
2.动态构造对象,使用new关键字分配动态内存,使得构造函数执行完毕后,对象所在空间仍然存在(注意,如果设置了QDialog的父窗口,就不必手动销毁动态分配的空间了,在关闭父窗口的同时,子窗口的内存空间也会被自动销毁) (推荐)
/*MyWidget.cpp 最终实现*/
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
#include<windows.h>
#include<QDebug>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog *dialog = new QDialog(this); //动态构造对象
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
这样就实现了子窗口和父窗口同时存在了。

2.模态
我们实现了子窗口和父窗口同时存在后,就会发现好像这个子窗口跟其他程序见到的不太一样

父窗口竟然在子窗口没关的情况下可以自由移动和变化!!
这就要引入模态(Modality)的概念
根据QT的帮助文档,其介绍说模态(Modality)是窗口的一个属性,具有模态的窗口可以组织其它的窗口接收事件信号,通俗点讲就是一个窗口若是模态,就不允许用户在其出现的情况下去操控别的窗口。当其被关闭后,才能进行其他窗口的操作。
如何设置模态呢?
通过QWidget::setModal(bool) 函数来设置
参数为TRUE(1)代表设置为模态窗口,参数为FALSE(0)代表设置为非模态窗口(默认)
/*MyWdiget.cpp 模态的设置*/
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
#include<windows.h>
#include<QDebug>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog *dialog = new QDialog(this);
dialog->setModal(TRUE); //将窗口设置为模态窗口
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
运行效果:

如图,在不关闭子窗口的情况下是无法操作父窗口的。
边栏推荐
猜你喜欢

堆(heap)系列_0x05:一张图剖析堆块分配和FreeLists的联系
【更新中7/31】NTIRE 2022 ESR(efficient super-resolution) 方案与结果

Vim实用技巧_0.vim - introduction

Vim practical skills_4. Manage multiple files (open + split + save + netrw)

TCP/IP协议组——完整工作过程分析

【力扣】17. 电话号码的字母组合
![[Paper reading] LIME: Low-light Image Enhancement via Illumination Map Estimation (the most complete notes)](/img/ca/6c8939fd752cc8928c2ffce0b090ed.png)
[Paper reading] LIME: Low-light Image Enhancement via Illumination Map Estimation (the most complete notes)

【剑指 Offer】 37. 序列化二叉树

【工具使用】Modscan32软件使用详解

Vim practical skills_3. Visual mode and command mode
随机推荐
【Postgraduate Work Weekly】(Week 9)
hugging face tutorial - Chinese translation - share a model
tensor转cv::Mat(即CHW转HWC)原理含C#代码实现
时间序列分析
【工具使用】Modsim32软件使用详解
[Paper reading] LIME: Low-light Image Enhancement via Illumination Map Estimation (the most complete notes)
ASCII码表
Monte Carlo simulation
Detailed Explanation of Software Secure Memory Area
关于sql语句中union和or的区别
深入浅出最优化(5) 共轭梯度下降法
Vitis部分实验记录
多元回归分析
GCC编译过程
深入浅出最优化(2) 步长的计算方法
使用NATS及其nats.c客户端简单示例用法(nats.c的API接口)
Principal Component Analysis - Applications of MATLAB in Mathematical Modeling (2nd Edition)
NLP-Reading Comprehension Task Learning Summary Overview
蓝桥杯嵌入式第四届省赛做题笔记
hugging face tutorial - Chinese translation - sharing custom model
