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. Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作

    Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作 1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1. ...

  2. div高度自适外层div高度随里层div高度自适

    尝试过许多办法 其中一网友的最靠谱就是在外层div样式添加两个标签(不能少) clear:both;  overflow:auto;

  3. beanutils中jdbc

    public class JDBCTest { //    public static void main(String[] args) throws Exception {//        Cla ...

  4. How feedback work for your improvement

    Why generally feedback is the perspective from others for some event. In China there is story,some k ...

  5. CSDN 高校俱乐部: 排列搜索

    CSDN 高校俱乐部/英雄会 题目: 设数组a包含n个元素恰好是0..n - 1的一个排列,给定b[0],b[1],b[2],b[3]问有多少个0..n-1的排列a,满足(a[a[b[0]]]*b[0 ...

  6. Day2:T1搜索 T2最小生成树

    T1:广搜+判断矩形 注:如何判断搜的是否为矩形: 在广搜的时候,记录下边界的坐标,然后枚举一遍过去,如果搜到"."就是牛群,否则就是房间 瞥了一眼ccy的做法,据说是floodf ...

  7. jQuery选择表格中的列

    以选择table中的第一列为例: 方式1: $("table tr").find("td:first").html("first column&quo ...

  8. 由浅入深shell脚本训练

    由浅入深shell脚本训练 最近一直在学习Shell,以前一直觉得Shell语法很难,不好学,现在总算有一些收获了.其实Shell脚本就是一堆linux命令的集合,把脚本里每一步的命令搞懂是什么意思, ...

  9. Python之FTP多线程下载文件之分块多线程文件合并

    Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...

  10. Aliexpress API 测试工具

    Aliexpress API 测试工具 上回简单说了 Aliexpress API 的认证流程, 这回在奉送一个小工具, API 测试工具. 点我下载 做这一行,和做程序员的生活完全不搭调, 格格不入 ...