qt学习记录002

不同的类

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类型)

运行后显示出来如下

关闭主窗口,发现两个都会关掉

并且会有下面的话,可以进而验证我们刚刚讲的理论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值