Object-Widgets-Quick 构造树
- 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信息。
- Widget Tree
Qt Widgets 扩展了object tree体系。 当以某个QWidget为父类创建一个子类时, 它会以父类坐标作为参考坐标,并被父类的边界切割,因此可以显式的看出父子关系;当然它也符合object tree的析构顺序。
- 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 构造树的更多相关文章
- C#结合Jquery LigerUI Tree插件构造树
Jquery LigerUI Tree是Jquery LigerUI()的插件之一,使用它可以快速的构建树形菜单.呵呵 废话不说了,直入正题,下面介绍C#结合ligerui 构造树形菜单的两种方法 1 ...
- 简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树
第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树. 本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...
- 简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树
这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与 ...
- java 根据 根节点及所有子成员 构造树tree
实体类entity package com.ompa.biz.entity; import java.util.ArrayList; import java.util.List; public cla ...
- C# 递归构造树状数据结构(泛型),如何构造?如何查询?
十年河东,十年河西,莫欺少年穷. 学无止境,精益求精 难得有清闲的一上午,索性写篇博客. 首先,我们需要准备一张表,如下范例: create table TreeTable ( TreeId ) no ...
- 根据 中序遍历 和 后序遍历构造树(Presentation)(C++)
好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找 ...
- CF1003E Tree Constructing 构造+树论
正解:构造 解题报告: 传送门! 这题麻油翻译鸭,,,那就先大概港下题意趴QAQ 构造一棵n个点,直径为d,每个点点度不超过k的树 这题其实我jio得还是比较简单的趴,,, 首先构造出一条直径,就是一 ...
- 树上的构造 树分治+树重心的性质 Codeforces Round #190 (Div. 2) E
http://codeforces.com/contest/322/problem/E E. Ciel the Commander time limit per test 1 second memor ...
- Codeforces Round #386 (Div. 2)G. New Roads [构造][树]
题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...
随机推荐
- ASP.NET vNext 在 Mac OS
让 ASP.NET vNext 在 Mac OS 中飞呀飞... 写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homeb ...
- 面试必须要知道的SQL语法,语句
面试必须要知道的SQL语法,语句 收藏 asc 按升序排列desc 按降序排列下列语句部分是Mssql语句,不可以在access中使用.SQL分类: DDL—数据定义语言(Create,Alter,D ...
- Mysql个人语句笔记
--一些简单语句记录: /*mysql*/SHOW DATABASES CREATE DATABASE guoDROP DATABASE guo /*查看创建的数据库*/SHOW CREATE DAT ...
- PHP中的表单提交和获取
在php中表单提交的方式有两种: 1.post提交,这种安全性较高. 2.get提交,他提交的是一个url地址,因此在从地址上面就可以看到许多信息,因此不安全. 每个表单<form>后面都 ...
- springmvc3.1.1+hibernate4
上篇介绍了基本的配置,这篇着重介绍与hibernate4整合. 1.web.xml文件中加入spring-hibernate的配置.新的web.xml文件内容如下: <?xml version= ...
- 一个简单的Garbage Collector的实现
一个简单的Garbage Collector的实现 前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为 ...
- [google面试CTCI] 2-0.链表的创建
创建链表.往链表中插入数据.删除数据等操作,以单链表为例. 1.使用C语言创建一个链表: typedef struct nd{ int data; struct nd* next; } node; / ...
- Navicat Premium 11.0.10破解补丁
Navicat Premium 11.0.10破解补丁 Navicat Premium 是一个可多重连接的数据库管理工具,让你以单一程序同時连接到 MySQL.SQL Server.SQLite. ...
- Android Widget(窗口小部件)
Android Widget简介 应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget Provide ...
- 简单的HTTP过滤模块
简单的HTTP过滤模块 一.Nginx的HTTP过滤模块特征 一个请求可以被任意个HTTP模块处理: 在普通HTTP模块处理请求完毕并调用ngx_http_send_header()发送HTTP头部或 ...