通过创建一个新的按钮类,来进行析构函数的验证,即对象树概念的验证。当程序结束的时候会自动的调用析构函数,

验证思路:

  要验证按钮会不会自动的析构,(即在QPushButton类里面的析构函数添加qDebug打印出一些东西就知道调用了),但是QPushButton的这个按钮类也不是自己写的(析构函数也就不知道在哪里),而是系统里就有的。所以这里为了实现验证,这里将会自己构建一个按钮类,并且自己写这个按钮类的析构函数,在析构函数里面添加打印的东西,这样当调用的时候就会显性的知道系统调用了析构函数。

新创建按钮类的时候,会发现并没有QPushButton这个基类,这个时候我们可以选择使用QWidget,在创建完成后,再重新写QPushButton,为了创建新的按钮,添加了两个文件,即mybutton.cpp和mybutton.h,

在mybutton.h的文件中需要改进的地方有两个,由于新建的按钮的基类实际上是QPushButton,所以这里我们将头文件由#include <QWidget>改为#include <QPushButton>,由class MyButton : publicQWidget     改为     class MyButton : public QPushButton(新按钮继承于QPushButton),

在mybutton.cpp文件中将

MyButton::MyButton(QWidget *parent) : QWidget(parent)

{
}

改为

MyButton::MyButton(QWidget *parent) : QPushButton(parent)

{
}
#include "mybutton.h"

#include <QDebug>
//通过参数列表给基类构造函数传参
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{ } MyButton::~MyButton()
{
qDebug()<<"按钮被析构";
}

#ifndef MYBUTTON_H
#define MYBUTTON_H #include <QPushButton> class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = ); ~MyButton();//自己添加的析构函数 signals: public slots:
}; #endif // MYBUTTON_H
#ifndef MYWIDGET_H
#define MYWIDGET_H #include <QWidget> class MyWidget : public QWidget
{
Q_OBJECT public:
MyWidget(QWidget *parent = );
~MyWidget();
}; #endif // MYWIDGET_H
#include "mywidget.h"
#include <QPushButton> #include <mybutton.h>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
/*对于父窗口(主窗口),坐标系统相对于屏幕
* 原点:相对于屏幕左上角
* x:往右递增
* y:向下递增
*/
move(,); /*子窗口,坐标系统相对于父窗口
* 原点:相对于窗口空白区域左上角(不包括边框)
* x:往右递增
* y:向下递增
*/
QPushButton *b1 = new QPushButton(this);
b1 ->move(,);
b1 ->setText("^_^");
b1 ->resize(,); QPushButton *b2 = new QPushButton(b1);
b2 ->move(,);
b2 ->setText("^_^"); MyButton *b3 = new MyButton(this);
b3 ->setText(""); //1) 指定父对象后 2)直接或间接继承于QObject
//子对象如果是动态分配空间的new,不需要手动释放delete
//系统会自动释放 } MyWidget::~MyWidget()
{ }

在以上的代码中有坐标系统的知识点,坐标系统的知识相对来说较简单,这里不用赘述了。重点叙述和要掌握怎么验证对象树和创建新的按钮类,以及实现这种对象树的条件。

 

QT +坐标系统 + 自定义控件 + 对象树的验证(自动进行析构)_内存回收机制的更多相关文章

  1. Qt ------ 内存回收机制、new对象的回收

    写在前面的总结: 建议:对于不能指定父对象的对象(对象通过moveToThread()移入其他线程.没有继承QObject的类产生的对象),在其他线程通过deleteLater()内存回收,其他通过指 ...

  2. Qt中的内存回收机制

    Qt中的内存回收机制 在Qt中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个parent到底是干什么的. QObject是以对象树的形式组织起来的.当你创建一个 ...

  3. qt 中的对象树

    本节内容讲解了什么是对象树以及其所带来的 GUI 编程好处.最后说明了在对象树中析构顺序问题并举了个特殊的例子,来说明平时编程中需要注意的一个点. 什么是对象树? 我们常常听到 QObject 会用对 ...

  4. redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

    一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...

  5. 自动内存管理机制之java内存区域与内存溢出异常

    一.运行时数据区域 java虚拟机所管理的内存会包括下面的几个部分: 1.程序计数器:是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器.一般情况下,字节码解释器工作的时候就是通过改变 ...

  6. Qt对象树

    Qt提供了一种机制,能够自动.有效的组织和管理继承自QObject的Qt对象,这种机制就是对象树.子对象动态分配空间不需要释放.

  7. Qt对象模型之二:对象树与元对象系统

    一.对象树的概念 Qt中使用对象树(object tree)来组织和管理所有的QObject类及其子类的对象.当创建一个QObject时,如果使用了其他的对象作为其父对象(parent),那么这个 Q ...

  8. QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系

    摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...

  9. QtCore是Qt的精髓(包括五大模块:元对象系统,属性系统,对象模型,对象树,信号槽)

    作者:小豆君的干货铺链接:https://www.zhihu.com/question/27040542/answer/218384474来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

随机推荐

  1. (水题)洛谷 - P1583 - 魔法照片

    https://www.luogu.org/problemnew/show/P1583 设计一个strcut cmp用来比较,就可以了. #include<bits/stdc++.h> u ...

  2. Swift3.0 字符串(string)

    string常用的一些操作方式 //字符串 //1.初始化字符串 //1.1通过字面量赋值的方式初始化字符串 let tempStrig = "this is temp string&quo ...

  3. 算法学习--Day3

    今天搞了一波算法的哈希,代码难道不大,记录在这里吧. 题目描述     “臭味相投”——这是我们描述朋友时喜欢用的词汇.两个人是朋友通常意味着他们存在着许多共同的兴趣.然而作为一个宅男,你发现自己与他 ...

  4. bzoj 2761: [JLOI2011]不重复数字【hash】

    map会T,双hash会冲突--于是非酋写了个三hash #include<iostream> #include<cstdio> #include<cstring> ...

  5. Luogu P3946 ことりのおやつ(小鸟的点心) 【最短路】By cellur925

    题目传送门 日本的冬天经常下雪.不幸的是,今天也是这样,每秒钟雪的厚度会增加q毫米. 秋叶原共有n个地点,编号从1到n.每个地点在开始的时候的积雪高度为hi. 有m条双向道路连接这些地点,它们的长度分 ...

  6. c 浮点科学计数法

    浮点数 比喻1e1 e后面跟的是10的指数(也就是1的10次方,e表示10次方),f表示浮点数 1e1表示1×10¹,其实就是10 再例如5e2f,表示5×10²,也就是500 =========== ...

  7. iOS中数据类型转换--遇到则记录

    1.NSString转NSNumber 使用情景:CoreData存储数据,其中一个为价格,CoreData里面定义为float 用文本输入框得到的数据类型是NSString,将NSString转换成 ...

  8. SOLR-disMax查询参数

    dismax参数用于处理用户输入的简单短语,并根据字段的重要度进行加权查询,查询范围为多个字段区域.dismax会忽略搜索字符串中的 "AND","OR", & ...

  9. Java 关键字volatile的解释

    volatile 关键字特征: 1.可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.可以禁止线程的工作内存对volatile修饰的变量进行缓存,并将修改的变量立即写入主存. 2. ...

  10. 命令模式和php实现

    命令模式: 命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模 ...