不同的类
QWidget介绍
在项目中add new一个widget文件,如下
类名改成TestWidget,然后下一步,完成。
不内嵌情况
在TestWidget.ui里面放几个按钮如下
代码按照以下进行添加,然后运行
可以看到两个窗口都是有边框的↓
内嵌情况
如果我们指定了对象呢?(注意这种情况下我没有对w进行show操作)
运行之后发现如下,
得到结论:
#if 0
// 创建窗口对象↓,没有给w指定父对象 也就是说w是一个独立窗口
// 只有独立的窗口有边框
TestWidget* w =new TestWidget;
// 显示w窗口
w->show();
#else
// 创建窗口对象↓,给w指定父对象 w不独立,显示父窗口时w会跟着显示出来
// explicit TestWidget(QWidget *parent = nullptr);
TestWidget* w =new TestWidget(this);
QDialog介绍
是QWidget的派生类(QDialog是所有窗口类的基类)
不能内嵌
下面演示它的两种显示方式:模态和非模态
首先add new
一般选择不带按钮的,名字TestDialog,下一步,完成。
非模态
dlg->show();
可以发现三个窗口我们可以任意选择
模态
模态↓,用exec,会阻塞程序的执行
dlg->exec();
发现只有两个窗口,并且只能是dialog能被操作而另一个没法被选择上(即不能进行焦点切换)
mainwindow(大窗口)没有显示是因为它的程序一整个走完才能显示而现在被阻塞在dialog这里了。
此时我们关闭dialog窗口发现大窗口就显示出来了,且可以进行焦点切换了。↓
QMainwindow介绍
也是不能内嵌
包含菜单栏,工具栏,状态栏↓(左侧控件名称,右侧控件类型)
可以看到有菜单栏,状态栏,但是没有工具栏,没有怎么办呢?没关系,可以手动添加
右键mainwindow,添加工具栏即可
注意:菜单栏和状态栏只能有一个,而工具栏可以有很多
Qt坐标体系
原理
如果我们进行嵌套,那么子窗口的位置比如说是(10,10)是相对于父窗口的原点来说的位置
同理如果我们在第二个窗口下再嵌套一个子窗口,坐标(10,10),那么此时的坐标又是相对于第二个窗口来说的了
因此可以总结出,子窗口的坐标是参考的父窗口的坐标原点
接下来是代码实例
1.添加头文件
2.创建按钮,指定位置,设置大小
3.由此copy出两个
4.设定父子关系
(在QPushButton* btnA=new QPushButton(this);这里修改了)
运行之后效果如下图
修改mainwindow相对于屏幕的位置
如果是想修改mainwindow相对于屏幕的位置呢?
对this进行move操作,可以看到我们mainwindow的位置也被指定了
QT中的内存回收机制
原理介绍:
一般来说需要自己new一个然后后面del,或者c语言中的malloc,之后再free
但是qt里面做了一些扩展,可以适当地回收某一对象的内存
此时new可以而malloc是不行的(new会调用构造函数而malloc不会)
QObject会有一个父对象指针,以此来建立父子关系。这时,如果父对象析构,它的所有子对象都会析构。
在析构时一般先从最下面的叶子开始,依次向上,如下图。(QObject是QWidget的父类,所以也有同样的性质。)
示例如下:
创建了一个subwindow(无窗口dialog类型)
运行后显示出来如下
关闭主窗口,发现两个都会关掉
并且会有下面的话,可以进而验证我们刚刚讲的理论。