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. 使用javaservice 将jboss 注册为服务

    近来做项目,需要jboss定期重新启动.不想再看到jboss启动那个黑洞洞的窗口,就想着把它注册为服务,然后在net start.恰好objectweb上有个open source的javaservi ...

  2. 查看mysql状态常用命令

    最近服务器上mysql有些奇奇怪怪的问题,可惜我不是专业的dba,为了加深自己对mysql的了解,先从基础的查看mysql状态命令看起吧. 命令: show status; 命令: show stat ...

  3. cygwin的安装使用

    Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 Bash shell 的改写 ...

  4. T4模板demo

    T4模板_根据DB生成实体类   为了减少重复劳动,可以通过T4读取数据库表结构,生成实体类,用下面的实例测试了一下 1.首先创建一个项目,并添加文本模板: 2.添加 文本模板: 3.向T4文本模板文 ...

  5. 话谈c#拷贝

    c#中类型分为值类型和引用类型,值类型对象赋值是本身就是赋的自身的一个副本,而引用类型赋值时则赋的是指向堆上的内存,假如我们不想赋这个地址而想将对象赋过去要怎么做呢?首先要知道拷贝分为浅表拷贝和深层拷 ...

  6. 用Haproxy给MySQL做负载均衡

    1.安装 # wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz # tar zcvf haproxy-1.4.24.t ...

  7. SET IDENTITY_INSERT详解

    声明:本博文摘自http://www.lmwlove.com/ac/ID500 自增列默认是不能插入显式值的,当我们试图给自增列插入值时,会报以下错误:当 IDENTITY_INSERT 设置为 OF ...

  8. [转]Installing Snow Leopard (Client) on VMware Fusion 6.0.3

    Source: http://inficererk.wordpress.com/2014/05/29/installing-snow-leopard-client-on-vmware-fusion-6 ...

  9. iOS内存错误EXC_BAD_ACCESS的解决方法(message sent to deallocated instance)

    iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里.通常这样的崩溃出现,原因一般就是:调用了已经释 ...

  10. C语言面试问答(3)

    12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(3) 前文链接:http://www.cnblogs.com/pmer/p/3322429.html 5,atexit wit ...