Qt学习--对象树的概念

文章目录

    • QPushButton 按钮
    • Qt中对象树的概念
    • 封装自定义控件

QPushButton 按钮

学习对象树之前,我们得先学习基本控件的创建。创建一个按钮
创建一个按钮:第一种方法

    // 创建一个按钮QPushButton *btn = new QPushButton;// 设置控件的父对象btn->setParent(this);// 显示文本btn->setText("确认");

注意,你需要设置button的父对象,如果你不设置,那么不会显示出来。
你需要手动btn->show();让他显示出来。但是这样显示出来是这样的
在这里插入图片描述
他不会出现在窗口中,而是独立出现,因为show()以顶层方式弹出控件。
所以我们需要设置他的父对象。
创建按钮:第二种方法

QPushButton* btn2 = new QPushButton("第二个按钮", this); //直接设置父对象

一些关于按钮和窗口的函数

demo::demo(QWidget *parent): QWidget(parent)
{ui.setupUi(this);// 设置窗口标题this->setWindowTitle("我的窗口标题");// 设置窗口大小this->resize(400, 300);  // 将窗口大小设置为 400x300 像素//设置固定大小,不允许缩放this->setFixedSize(400, 300);//创建按钮QPushButton* btn = new QPushButton("确认按钮", this);//调整位置  w h btn->move(100, 100);btn->resize(60, 60);
}

Qt中对象树的概念

在Qt中,对象树(Object Tree)是一种层次结构,它管理着应用程序中所有对象的关系。每个Qt对象都可以有一个父对象(Parent),并且可以有零个或多个子对象(Children)。这种父子关系构成了对象树。

  • 父子关系
    每个Qt对象(除了顶级窗口如QMainWindow、QWidget等)都有一个父对象。当创建一个对象时,可以通过传递父对象给构造函数来建立父子关系。
  • 内存管理
    当父对象析构的时候,这个子对象列表中的所有对象都会被析构,当析构子对象的时候,会自动从父对象的子对象列表中删除。
  • 布局管理
    父对象通常负责其子对象的布局。Qt的布局管理器(如QHBoxLayout、QVBoxLayout等)可以自动调整子控件的位置和大小。
  • 事件处理
    事件(如鼠标点击或键盘输入)可以在对象树中向上或向下传递。子对象可以捕获来自父对象的事件,也可以将事件传递给父对象。
    在这里插入图片描述
    它的构造顺序是从上到下,析构顺序是从下到上。
    所以你创建一个对象的时候,指明其父对象,就可以不用管他的析构,父对象析构时,会帮你自动析构子对象。

封装自定义控件

可以看下,我在项目中的文件(我是在vs2019下使用qt,跟qt creator不一样)

在这里插入图片描述
现在我们来封装一个自定义的控件。
右键点击项目,选择添加新建项。
在这里插入图片描述
然后选择c++类,名字自己起一个。
在这里插入图片描述
然后这里,上面的你都不用改。选择一个基类。我们写QPushButton,因为我们要封装一个按钮,自然是继承于Qt本来的按钮,当然了,你也可以选择QWidget,QWidget是QPushButton的父类,你选择谁作为基类,取决于你的需求。
在这里插入图片描述
点击创建。完成后就会多了这俩文件
在这里插入图片描述
我们可以看下myButton.h中生成的代码,可以看到,这个类继承于QPushButton。
在这里插入图片描述
继承已经完成了。这就是一个自定义的按钮,你可以在这里面重写QPushButton的各种函数,也可以封装你自己想要的功能。
只需要在其他程序中引入,然后调用即可。
我们现在要练习一下,上面讲的对象树的概念。
现在我们在.h文件中为我们的自定义类写一个析构函数和构造函数。(注意,他继承于QPushButton,不写构造和析构编译器会给你自动生成,但是你也可以显式的指明构造和析构,也就是自己写)
myButton.h中

#include <qpushbutton.h>
#include <QDebug>
class myButton : public QPushButton
{Q_OBJECT  //启用Qt的元对象系统,可以使用信号、槽等
public:myButton(QWidget* parent = nullptr);//构造函数,默认传入的父对象是空,即为顶级窗口~myButton();
};

myButton.cpp中

#include "myButton.h"myButton::myButton(QWidget* parent) : QPushButton(parent)
{qDebug() << "myButton类的构造函数";
}
myButton::~myButton()
{qDebug() << "myButton类的析构函数";
}

ps:这里补充一个点:
c++里面有个语法,可以初始化成员列表
成员初始化列表是C++中的一个特性,它允许在构造函数中对类的成员变量进行初始化。成员初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。例如:

class MyClass {
public:MyClass(int a, int b) : m_a(a), m_b(b) { }
private:int m_a;int m_b;
};

这种我们都知道。但是此处:myButton::myButton(QWidget* parent) : QPushButton(parent)这个的意思是调用基类的构造函数,初始化基类成员。
比如说:我们这个按钮是继承于QPushButton的,构造的时候会指明我们这个自定义按钮的父对象。但是基类的父对象呢?并没有指明,所以这里语法的意思就是,构造自定义按钮的时候,传入的那个parent,我会调用基类QPushButton的构造函数,并将parent传给基类的构造函数,也就是将这个父对象设置为基类的父对象。

这种语法是 C++ 的一种特性,专门用于在派生类构造函数中初始化基类成员。

如果我们没有为派生类(在这个例子中是 myButton 类)显式编写构造函数,编译器将自动为你生成一个默认的构造函数。这个默认构造函数将调用基类(这里是 QPushButton)的默认构造函数。
在 C++ 中,如果派生类的构造函数没有明确定义,编译器生成的默认构造函数将按照以下步骤工作:

  • 成员初始化: 首先,使用成员初始化列表对派生类中的成员变量进行初始化。
  • 基类构造函数调用: 然后,调用基类的默认构造函数。这是通过在成员初始化列表中隐式地进行的,即使你没有显式写出基类的构造函数调用。
  • 构造函数体: 由于没有定义构造函数体,编译器不会添加任何额外的代码。

这意味着,即使我们没有显式定义 myButton 的构造函数,创建 myButton 对象时,编译器生成的默认构造函数也会确保 基类QPushButton 的构造函数被调用,从而正确初始化从基类继承的所有成员。

好了,回到我们的正题。
我重写了构造函数。
此时,我在另一个新的文件中,引入我自定义的这个按钮的头文件。并且调用我这个自定义的按钮;

    // 创建一个自定义按钮myButton* myBtn = new myButton;myBtn->setParent(this);myBtn->setText("自定义按钮");

我们new了,但是没有释放空间,但是我们指定了按钮的父对象。运行看下。
在这里插入图片描述
可以看到,自定义控件的构造和析构都被正确的调用了。这验证了我们前面提到的对象树的概念。你给他设置了父对象,他的父对象会管理他,不需要你释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文本解码原理--MindNLP

前言 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 Greedy search 在每个时间步&#x1d461;都简单地选择概率最高的词作为当前输出词: &#x1d464;&#x1d461;&#x1d44e;&#x1d45f;&#x1d454;&#x1d45a;&am…

CSS 基础知识

CSS(级联样式表)是设置 Web 内容样式的代码。CSS 基础知识将介绍入门所需的内容。我们将回答以下问题:如何将文本设置为红色?如何使内容显示在(网页)布局中的某个位置?如何用背景图片和颜色装饰我的网页? 什么是CSS? 像HTML一样,CSS不是一种编程语言。它也不是一种标…

前端了解到框架-网络复习

前端 HTML 超文本标记语言 画页面 各种各样的标签组成页面进行展示 桌面创建文本修改后缀即可 <!DOCTYPE html>: 声明文档类型和HTML版本。<html>: 根标签&#xff0c;所有其他标签都包含在内。<head>: 包含了文档的元数据&#xff0c;如字符编码、网页标…

58 高级IO

本章重点 理解五种io模型的基本概念&#xff0c;重点是io的多路转接 掌握select模型&#xff0c;实现select版本的tcp服务器 掌握poll模型&#xff0c;实现poll版本的tcp服务器 掌握epoll模型&#xff0c;实现epoll版本的tcp服务器 理解epoll的LT模型和ET模式 理解select和epo…

关于数据存储位置的一点知识

关于数据存储位置的一点知识

[算法]插入排序和希尔排序

这里简单的介绍一下插入排序和希尔排序的算法实现&#xff0c;为简单起见&#xff0c;排序为升序且排序的数组是整形数组。 一、插入排序 &#xff08;一&#xff09;、算法思路 把数组里的第一个元素视为有序的&#xff0c;然后取第二个元素与前面的元素作比较&#xff0c;如…

【秋招笔试题】小Q的树

解析&#xff1a;分析易得走过的路中至多存在一个分叉&#xff0c;则维护每个结点接下来的路的最大值与次大值然后相加即可。 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define int long long const int MAXN 1…

ESD防护之电容妙用

谈到ESD防护&#xff0c;应用最广泛的是ESD/TVS管&#xff0c;对于正负4KV的pin脚不上电ESD测试&#xff0c;也可以仅仅依靠nf级电容完成ESD防护。下面以一篇实际案例进行说明。 实验要求&#xff1a;正负4KV对产品connector的Pin脚进行ESD测试&#xff0c;connector中的地脚接…

栈和队列<数据结构 C版>

目录 栈&#xff08;Stack&#xff09; 栈的结构体 初始化 销毁 入栈 判空 出栈 取栈顶元素 获取栈个数 测试&#xff1a; 队列&#xff08;Queue&#xff09; 队列的结构体 单个结点 队列 初始化 销毁 入队列&#xff0c;队尾 判空 出队列&#xff0c;队头 …

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下&#xff0c;处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发&#xff0c;统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体&#xff0c;并分享…

二市在度低开,连续11个交易日低开,后市如何走?

今天的A股&#xff0c;让人愣住了&#xff0c;你知道是为什么吗&#xff1f;盘面上出现2个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市再度低开&#xff0c;连续11个交易日低开&#xff0c;让很多人愣住了。别慌&#xff01;汽车、军工板块大涨&#x…

MYSQL存储引擎InnoDB, MyISAM简介

MYSQL存储引擎 在开始谈到mysql存储引擎之前&#xff0c;我们应该知道或者了解存储引擎是什么&#xff0c;存储引擎是为了解决什么样的问题的。 在mysql中&#xff0c;存储引擎是处理不同表类型SQL操作的MySQL组件&#xff0c;同时MySQL服务器采用可插拔的存储引擎架构&#x…

XLua 原理分析 三

前面已经介绍了Lua与C#的基础通信原理&#xff0c;和Wrap中间文件的作用。有了前面2篇的基础&#xff0c;大概已经能搞清这块的原理。 为了加深对这块的印象&#xff0c;这里开始正式分析Xlua中的Lua和C#的通信。 一、Lua如何调用CS的过程 lua的初始化代码&#xff1a; pri…

乌班图下的vscode粘贴代码后一直在输入CTRLV命令

最近在VMware中使用vscode开发c程序中&#xff0c;拷贝一段代码后&#xff0c;代码界面一直输入CTRLV命令&#xff0c;导致乌班图桌面死掉&#xff0c;无法操作、 解决方法&#xff1a; 1、强制重启。长按电源按钮强制关机&#xff0c;然后再次开机。 2、使用命令行界面。同时…

1.ESP32-CAM 下使用 ESP-IDF 打开摄像头

主要资料&#xff1a; 乐鑫官方编程指南 ESP-IDF 编程指南安信可官方模块页 安信可-ESP32-CAM摄像头开发板官方使用教程 安信可ESP32-CAM摄像头开发demo–局域网拍照、实时视频、人脸识别 &#xff08;开发环境是Linux&#xff09; 本文目标是在 Windows 下跑通摄像头 hello …

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…

python count返回什么

描述 count() 方法用于统计字符串中某个子字符串出现的次数&#xff0c;可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法&#xff1a; S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数&#xff0c;…

【数据结构】哈希表的模拟实现

文章目录 1. 哈希的概念2. 哈希表与哈希函数2.1 哈希冲突2.2 哈希函数2.3 哈希冲突的解决2.3.1 闭散列&#xff08;线性探测&#xff09;2.3.2 闭散列的实现2.3.3 开散列(哈希桶)2.3.4 开散列的实现 2.4 开散列与闭散列比较 1. 哈希的概念 在我们之前所接触到的所有的数据结构…

FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 推荐课程列表 逻辑很简单 点赞数 > 500 那么符合要求的课程是&#xff1a; def get_like_course(db: Session):"""获取推荐课程…

一番赏小程序搭建,线上一番赏市场

一番赏作为一个经久不衰的潮流市场&#xff0c;一直流行于消费者市场中。一番赏商品拥有不同系列&#xff0c;涵盖了热门动漫、漫画、影视等主题&#xff0c;商品包含了手办等周边商品&#xff0c;具有非常大的收藏价值。相比于其他潮玩模式&#xff0c;一番赏的性价比更高&…