当前位置:网站首页>【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;
}
运行效果:
如图,在不关闭子窗口的情况下是无法操作父窗口的。
边栏推荐
猜你喜欢
随机推荐
Detailed Explanation of Software Secure Memory Area
Virtualbox 设置共享文件夹
Hold face (hugging face) tutorial - Chinese translation - create a custom framework
Faster R-CNN 论文总结
层次分析法
Excel绘制统计图
Face recognition sample code analysis (1) - program parameter analysis
LeNet5 pytorch实现
图论最短路径求解
堆(heap)系列_0x05:一张图剖析堆块分配和FreeLists的联系
Correlation analysis
Matlab做分布拟合及绘制频率分布直方图
交叉编译 Crypto++
灰色关联度矩阵——MATLAB在数学建模中的应用
【Postgraduate Work Weekly】(Week 9)
Face recognition sample code analysis (2) - face recognition analysis
将类指针强制转换为void*指针进行传参的使用方法
堆(heap)系列_0x09:堆破坏示例(非法访问+未初始化+堆句柄不匹配)
PE格式系列_0x05:输出表和重定位表(.reloc)
Vim实用技巧_1.vim解决问题的方式