1. Object Tree

当以某个QObject为父类创建一个QObject时, 它会被添加到该父类的children列表中。 析构时, QObjet 会首先检查自己的children, 依次析构, 然后析构自己,再把自己从父类的children列表中删除。这是一个递归过程, 对于object tree来说, 析构是一个从叶子到根的过程。

如果使用堆存储object tree, 则可以以任何顺序构造、或者析构; 因为显式调用delete时, object tree会删除该节点; 没有调用delete时, object tree会在整棵树被销毁时按照从叶子到根的顺序析构。

如果使用栈存储object tree, 会存在问题。如下所示,根据C++标准,后构造者先析构,系统会首先调用quit的析构函数,把quit从window的object tree中删除, 并析构quit, 然后才会调用 window的析构函数。

int main()

{

    QWidget window;

    QPushButton quit("Quit", &window);

    ...

}

但是如下代码则会存在问题, 系统会首先调用window的析构函数, 把window和quit都析构掉,然后才会调用quit的析构函数, 但是quit已经被析构掉了。

int main()

{

    QPushButton quit("Quit");

    QWidget window;

 

    quit.setParent(&window);

    ...

}

因此使用object tree也不是完全能避免内存问题的, QObject提供了两个函数QObject::dumpObjectTree() 和 QObject::dumpObjectInfo()用于调试 , 如果发现程序有不正常的现象发生, 可以使用这两个函数查看 dump信息。

  1. Widget Tree

Qt Widgets 扩展了object tree体系。 当以某个QWidget为父类创建一个子类时, 它会以父类坐标作为参考坐标,并被父类的边界切割,因此可以显式的看出父子关系;当然它也符合object tree的析构顺序。

  1. Quick Tree

QQuickItem 有一个 visual parent 概念, 也就是(在坐标上)包含它的object。 Visual parent可以不是它的object parent, visual parent存储在 parent 属性中,如果parent为null, 则该item不会被scene渲染。

QQuickWindow::contentItem 存储Qt Quick scene中被渲染的根元素, 如果要添加自己要渲染的元素, 则应该把要渲染的元素添加到contentItem的visual tree中。

Visual parent

当在一个 QQuickItem中声明一个object时,它默认会被加到data列表中, 也可以显式的在data中声明, (如果显式的把它赋值给另一个属性,则不会添加到data中);这时该object的object parent就是声明它的QQuickItem。而如果这个object的类型是Item(QQuickItem), 那么它的visual parent默认就是声明它的QQuickItem, 它会被加到children列表中, 因此, QQuickItem的parent 、children和 object的完全是两码事, 而QWidget的parent-children可以认为即是visual parent,又是object parent。

一个visual parent 会以自己的方式计算childrenRect, 但是不同于Qt Widgets, 它不会自动调整children的大小、位置——当然,一些拥有内建行为的控件除外, 例如Row、Column等,这些控件会排列其children的位置,但是这是继承Item以后添加的特殊动作, 并不属于visual parent的默认行为。

Visual parent默认也不会裁剪超出自己边界的children, 当然这个是可控的, 把clip属性设置为true则会开启裁剪动作。

Visual Coordinate

QQuickItem符合笛卡尔坐标,x、y分别向右向下延伸,子控件以父控件左上作为自己的(0,0)。

Stacking order

QQuickItem把子控件绘制在父控件之上,然后按照声明顺序绘制sibling控件(后声明的绘制在上层),以此递归的决定绘制顺序。这个顺序可以由z属性控制。不过按照先父子、后兄弟的顺序,如果一个控件的父控件在另一个控件树(visual-tree)之下(被遮挡), 那么无论你如果修改该控件的z值,它都不会居于这个控件树之上。

Object-Widgets-Quick 构造树的更多相关文章

  1. C#结合Jquery LigerUI Tree插件构造树

    Jquery LigerUI Tree是Jquery LigerUI()的插件之一,使用它可以快速的构建树形菜单.呵呵 废话不说了,直入正题,下面介绍C#结合ligerui 构造树形菜单的两种方法 1 ...

  2. 简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树

    第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树.  本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...

  3. 简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树

     这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与 ...

  4. java 根据 根节点及所有子成员 构造树tree

    实体类entity package com.ompa.biz.entity; import java.util.ArrayList; import java.util.List; public cla ...

  5. C# 递归构造树状数据结构(泛型),如何构造?如何查询?

    十年河东,十年河西,莫欺少年穷. 学无止境,精益求精 难得有清闲的一上午,索性写篇博客. 首先,我们需要准备一张表,如下范例: create table TreeTable ( TreeId ) no ...

  6. 根据 中序遍历 和 后序遍历构造树(Presentation)(C++)

    好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找 ...

  7. CF1003E Tree Constructing 构造+树论

    正解:构造 解题报告: 传送门! 这题麻油翻译鸭,,,那就先大概港下题意趴QAQ 构造一棵n个点,直径为d,每个点点度不超过k的树 这题其实我jio得还是比较简单的趴,,, 首先构造出一条直径,就是一 ...

  8. 树上的构造 树分治+树重心的性质 Codeforces Round #190 (Div. 2) E

    http://codeforces.com/contest/322/problem/E E. Ciel the Commander time limit per test 1 second memor ...

  9. Codeforces Round #386 (Div. 2)G. New Roads [构造][树]

    题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...

随机推荐

  1. ASP.NET vNext 在 Mac OS

    让 ASP.NET vNext 在 Mac OS 中飞呀飞...   写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homeb ...

  2. 面试必须要知道的SQL语法,语句

    面试必须要知道的SQL语法,语句 收藏 asc 按升序排列desc 按降序排列下列语句部分是Mssql语句,不可以在access中使用.SQL分类: DDL—数据定义语言(Create,Alter,D ...

  3. Mysql个人语句笔记

    --一些简单语句记录: /*mysql*/SHOW DATABASES CREATE DATABASE guoDROP DATABASE guo /*查看创建的数据库*/SHOW CREATE DAT ...

  4. PHP中的表单提交和获取

    在php中表单提交的方式有两种: 1.post提交,这种安全性较高. 2.get提交,他提交的是一个url地址,因此在从地址上面就可以看到许多信息,因此不安全. 每个表单<form>后面都 ...

  5. springmvc3.1.1+hibernate4

    上篇介绍了基本的配置,这篇着重介绍与hibernate4整合. 1.web.xml文件中加入spring-hibernate的配置.新的web.xml文件内容如下: <?xml version= ...

  6. 一个简单的Garbage Collector的实现

    一个简单的Garbage Collector的实现 前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为 ...

  7. [google面试CTCI] 2-0.链表的创建

    创建链表.往链表中插入数据.删除数据等操作,以单链表为例. 1.使用C语言创建一个链表: typedef struct nd{ int data; struct nd* next; } node; / ...

  8. Navicat Premium 11.0.10破解补丁

    Navicat Premium 11.0.10破解补丁   Navicat Premium 是一个可多重连接的数据库管理工具,让你以单一程序同時连接到 MySQL.SQL Server.SQLite. ...

  9. Android Widget(窗口小部件)

    Android Widget简介 应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget Provide ...

  10. 简单的HTTP过滤模块

    简单的HTTP过滤模块 一.Nginx的HTTP过滤模块特征 一个请求可以被任意个HTTP模块处理: 在普通HTTP模块处理请求完毕并调用ngx_http_send_header()发送HTTP头部或 ...