QT窗口的设置、按钮的创建和对象树的概念

目录

设置窗口属性

按钮的创建

对象树

对象树的概念

构建和析构的顺序问题


设置窗口属性

在Qt官方手册中查找QWidget相关信息 或者在QT软件帮助一栏直接搜索QWidget 即可找到一些要寻找的设置属性的函数

将代码写在构造函数中

widget.cpp

cpp 复制代码
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("hello qt widget");//设置窗口文本
    //this->resize(600,400);//设置窗口的大小  长600 宽400 可拉伸
    this->setFixedSize(800,400);//设置窗口的大小 长600 宽400 不可拉伸
}

Widget::~Widget()
{

}

按钮的创建

在qt手册中查找按钮所包含的头文件

函数相关参数

widget.cpp

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QPushButton>
#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    QPushButton *button;//添加一个指针
};

#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    button = new QPushButton;
    //构造函数时指定父对象
    //button = new QPushButton("登录",this);
    //如果不给按钮指定父对象,按钮和窗口单独显示
    //如果指定父对象,只要父对象显示了,按钮也会显示
    button->show();

    button->setParent(this);//指定按钮的父类是窗口
    button->resize(600,200);//设置按钮的大小 600宽 200高
    button->move(200,100);//设置按钮在窗口的位置
    button->setText("登录");//设置按钮文本
}

Widget::~Widget()
{

}

对象树

对象树的概念

这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>,专门存储这个类的子孙后代们。比如创建一个 QObject 对象并指定父对象时,就会把自己加入到父对象的 childre() 列表中,也就是 QList<QObject *> 变量中。父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)

举个例子,有一个窗口 Window,里面有 Label标签、TextEdit文本输入框、Button按钮这三个元素,并且都设置 Window 为它们的父对象。这时候我做了一个关闭窗口的操作,作为程序员的你是不是自然想到将所有和窗口相关的对象析构啊?古老的办法就是一个个手动 delete 呗。是不是很麻烦?Qt 运用对象树模式,当父对象被析构时,子对象自动就 delete 掉了,不用再写一大堆的代码了。

QWidget 是能够在屏幕上显示的一切组件的父类(QWidget 继承自 QObject,因此也继承了这种对象树关系。)

定义一个mybutton的指针变量b

设置b的父对象

在析构函数被调用时 打印调试信息

可以看到 在窗口被关闭时 按钮的析构函数被调用

构建和析构的顺序问题

正常情况下,最后被创建出来的会先被析构掉。就好比我有一个大桌子,上面先摆放一个盘子,再摆放一个碗。当我要把桌子撤掉的时候,会先撤掉碗,再撤掉盘子,最后撤掉桌子。

用代码来演示一下:

int main()

{

QWidget window;//创建窗口

QPushButton quit("Quit", &window);//指定按钮的父对象是窗口

}

后创建的 quit 对象指定了 window 为其父对象。那么关闭程序时,会先调用它的析构函数,然后调用 window 的析构函数。

这就牵扯到一个特殊情况:

int main()

{

QPushButton quit("Quit");//首先创建按钮

QWidget window;//然后再创建窗口

quit.setParent(&window);//设置父对象

}

如果反过来,由于 window 后创建,程序关闭时先调用 window 的析构函数(此时 quit 被第一次析构)。接着调用 quit 的析构函数(此时 quit 被第二次析构),这时由于被两次析构,所以出问题了。

这种特殊情况在编程中很隐蔽,不容易发现。因为编译的时候不会报错,只有运行时才会产生问题。我们最好从开始就养成良好习惯,在 Qt 中,尽量在构 造的时候就指定 parent 对象,并且大胆在堆上创建。

相关推荐
weixin_307779139 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
AI wins10 小时前
c++新增頭文件
c++
Shadow(⊙o⊙)10 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++
by2099910 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
音草11 小时前
C++ 继承详解:从概念到菱形继承
c++
weixin_3077791311 小时前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
xiaoye-duck12 小时前
《C++ 项目:手写大模型接入 SDK》Trae IDE 开发环境搭建与依赖管理
c++·ide·语言模型
沫璃染墨12 小时前
《Qt从零入门系列(十四):QThread多线程详解——从线程创建到客户端阻塞处理》
开发语言·c++·笔记·qt·ui·交互·线程
草莓熊Lotso12 小时前
【C++ 基于微服务的即时通讯系统】Elasticsearch 从安装到 C++ 客户端二次封装全落地
linux·网络·数据库·c++·elasticsearch·微服务
CHPCWWHSU12 小时前
FreeCAD 源码解读:从 Property 到 Command,看一套 CAD 内核的完整闭环
c++·cad