使用Qt的QObject类实现多叉树
来源:互联网 发布:eclipse.ini 配置优化 编辑:程序博客网 时间:2024/04/30 05:37
使用Qt的QObject类实现多叉树
最近研究骨骼动画,需要显示人物模型的骨骼结构,说到骨骼结构,在计算机图形学中通常用树状结构来描述,在一篇介绍骨骼动画的文章中也谈到了树状结构。树是一种数据结构,它通常通过链式结构的形式来存储,能够直观地表达自然界的层次关系。正是因为树的这些特点,它非常适合渲染骨骼。
接下来就是如何实现树状结构了,虽然我以前实现过二叉树,但是这次要做的是多叉树,它具有多个孩子,还是有些不同的。一位高手自己通过std::vector和链式结构实现了多叉树,而强大的Qt开发框架似乎没有这样的数据结构?难道我也要自己动手?
回家的路上我想到Qt不是有父子树结构吗?通过这样特殊的数据结构可以省去了delete操作符的调用,实现了半自动内存管理。其实Qt的父子树结构也可以用作二叉树和多叉树。下面请看我写的一小段代码:
#include <QDebug>#include <QCoreApplication>#include <QObject>#include <QRegularExpression> int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QObject* pA1 = new QObject( Q_NULLPTR ); pA1->setObjectName( "A1" ); QObject* pB1 = new QObject( pA1 ); pB1->setObjectName( "B1" ); QObject* pB2 = new QObject( pA1 ); pB2->setObjectName( "B2" ); QObject* pC1 = new QObject( pB2 ); pC1->setObjectName( "C1" ); QObject* pC2 = new QObject( pB2 ); pC2->setObjectName( "C2" ); QObject* pC3 = new QObject( pB2 ); pC3->setObjectName( "C3" ); QObject* pD1 = new QObject( pC2 ); pD1->setObjectName( "D1" ); pA1->dumpObjectTree( ); qDebug( ) << pA1->findChildren<QObject*>( QRegularExpression("B" ), Qt::FindDirectChildrenOnly); delete pA1; return a.exec();}
在这里我创建了几个QObject对象,其中ABCD代表着四个层级,通过QObject::dumpObjectTree()可以在控制台上看到我们创建的树的情况,而要查找它的孩子,Qt也有多个版本的QObject::findChild()模版函数和QObject::findChildren()模版函数。要注意的是,要创建基于QObject的多叉树,所有的节点(QObject)都必须在堆上创建,因为在析构的时候Qt在内部会调用delete操作符,这就要求操作数必须在堆上创建,否则出错。我的另外一篇文章讲到了Qt父子系统更多内容。
那么如何遍历树的所有节点?也不难,通过这样调用:findChildren<QObject*>( QString() );就可以获得QObject的所有孩子(不包括本身),需要注意的是,这样的遍历方法是先序遍历方法。
Qt还提供了一个函数QObject::children(),它用来返回的是它的直属孩子。当然也可以通过findChildren<QObject*>( QString(), Qt::FindDirectChildrenOnly );来实现。
- 使用Qt的QObject类实现多叉树
- 使用Qt的QObject函数实现二叉树或多叉树
- QT 读 QObject类
- QObject是QT所有类的基类,QObject是Qt Object Model的核心
- QObject是QT所有类的基类
- Qt的句柄类和实体类-QObject和QOjectPrivate
- QObject是QT所有类的基类
- Qt定时器:QObject类的定时器和定时器类QTimer
- Qt的句柄类和实体类-QObject和QOjectPrivate
- QObject派生类作为Qt 插件的Interface
- QObject派生类作为Qt 插件的Interface
- Qt+halcon 第一个程序 QObject类的定时器应用
- QT QOBJECT
- Qt--QObject
- 【Qt入门实践】QObject使用总结
- qt使用QTranslator QObject::tr(“”)软件国际化
- QT笔记:QObject::sender()的用法
- QT QObject::connect函数的学习
- IOS实现弹出菜单效果MenuViewController(背景 景深 弹出菜单)
- Java深拷贝与浅拷贝原理
- hdu 4745 Two Rabbits
- Node.js学习(15)----Express 3.x和Express 2.x区别
- 架构师面试【1】
- 使用Qt的QObject类实现多叉树
- 6410音频ALSA驱动框架分析
- 第一次
- /sys/bus一个总线设备驱动
- 用C语言解析BMP文件的结构
- javascript 遍历表格中的内容
- [HengStar-Boost讲堂]多索引容器multi_index_container实战
- [C语言]菜鸟的一些理解-结构体,共用体,枚举,位域
- Java中的ArrayList数组