使用C++实现QML的TreeView Model (二)_PHP教程

php中文网
发布: 2016-07-12 08:54:17
原创
1391人浏览过

宣小二
宣小二

宣小二:媒体发稿平台,自媒体发稿平台,短视频矩阵发布平台,基于AI驱动的企业自助式投放平台。

宣小二 21
查看详情 宣小二

使用c++实现qml的treeview model (二)

上文已经介绍过二维表模型的实现方式,接着分享层次模型的实现,首先实现一个节点类用于保存树状数据模型的节点数据和节点关系:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>class treenode;<br /> </li><li><br /></li><li>typedef treenode* treenodeptr;<br /></li><li><br /></li><li>class treenode<br /></li><li>{<br /></li><li>public:<br /></li><li>explicit treenode();<br /></li><li>treenodeptr parent() const;<br /></li><li>void setparent(const treenodeptr p); //设置父节点,根节点的父节点为null<br /></li><li>void appendnode(treenodeptr node);<br /></li><li>void removenode(int row);<br /></li><li>void setdata(int role,qvariant value);  </li><li>qlist<treenodeptr>childs;  //用于保存子节点指针,把childs放到public不好,仅仅是为了方便,不要学。<br /></li><li><br /></li><li>private:<br /></li><li>treenodeptr mparent=null;  //父节点<br /></li><li>qhash<int,qvariant>mrecord; //一个节点可以保存一行数据,哈希表的key是整型,用于保存role,qvariant保存数据<br /></li><li><br /></li><li>}; </li></ol>
登录后复制
treenode的实现也是相当简单:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>treenodeptr treenode::parent() const<br /> </li><li>{<br /></li><li>return mparent;<br /></li><li>}<br /></li><li><br /></li><li>void treenode::setparent(const treenodeptr p)<br /></li><li>{<br /></li><li>this->mparent = p;<br /></li><li>}<br /></li><li><br /></li><li>void treenode::appendnode(treenodeptr node)<br /></li><li>{<br /></li><li>childs.append(node);<br /></li><li>}<br /></li><li><br /></li><li>void treenode::removenode(int row)<br /></li><li>{<br /></li><li>childs.removeat(row);<br /></li><li>}<br /></li><li><br /></li><li><br /></li><li>qvariant treenode::data(int role)<br /></li><li>{<br /></li><li>return mrecord[role];<br /></li><li>}<br /></li><li><br /></li><li>void treenode::setdata(int role, qvariant value)<br /></li><li>{<br /></li><li>mrecord[role] = value;<br /></li><li>} </li></ol>
登录后复制
接下来开始对sqlmenuentrymodel进行手术:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>class sqlmenuentry:public qabstractitemmodel,public qqmlparserstatus<br /> </li><li>{<br /></li><li>q_object<br /></li><li>public:<br /></li><li>explicit sqlmenuentry(qobject *parent=0);<br /></li><li>~sqlmenuentry();<br /></li><li>enum menuentryroles{idrole=qt::userrole+1,namerole,defaultentryrole,customentryrole,iconrole,iconhoverrole};<br /></li><li>int rowcount(const qmodelindex &parent=qmodelindex()) const;<br /></li><li>int columncount(const qmodelindex &parent=qmodelindex()) const;<br /></li><li>qmodelindex index(int row, int column, const qmodelindex &parent=qmodelindex()) const;<br /></li><li>qvariant data(const qmodelindex &index, int role=qt::displayrole) const;<br /></li><li>qmodelindex parent(const qmodelindex &child) const;<br /></li><li>qhash<int,qbytearray>rolenames() const;<br /></li><li>private:<br /></li><li>qhash<int,qbytearray> mrolenames;<br /></li><li>  <s>qlist</s><s><</s><s>qhash</s><s><</s><s>int</s><s>,</s><s>qvariant</s><s>></s><s>></s><s> mrecords</s><s>;</s> //qlist不能保存树状数据,干掉<br /></li><li>  qlist mrootentrys;   //用于保存根节点 </li><li>  void _addentrynode(treenodeptr node,treenodeptr parent=0); //用于向树添加节点 </li><li>}; </li></ol>
登录后复制
_addentrynode的实现如下:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>void sqlmenuentry::_addentrynode(treenodeptr node, treenodeptr parent)<br /> </li><li>{<br /></li><li>if(parent == null)<br /></li><li>{<br /></li><li>mrootentrys.append(node);<br /></li><li>}else{<br /></li><li>node->setparent(parent);<br /></li><li>parent->appendnode(node);<br /></li><li>}<br /></li><li>} </li><li><br /> </li></ol>
登录后复制
可以通过如下代码向模型添加数据:


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>beginresetmodel();<br /> </li><li><br /></li><li>auto node = new treenode(); </li><li>node->setdata(namerole,"parent 1");<br /></li><li>node->setdata(iconrole,"parenticon1"); </li><li>_addentrynode(node);  //添加第一个根节点<br /></li><li>    </li><li>     auto subnode = new treenode(); </li><li>     subnode->setdata(namerole,"child1");<br /></li><li>     _addentrynode(subnode,node); //添加子节点 </li><li><br /> </li><li>endresetmodel(); </li></ol>
登录后复制
上面的代码向模型添加了一个根节点parent1和parent1的一个子节点child1,接下来可以对sqlmenuentrymodel进行持续改进,让treeview可以顺利显示正确的数据和数据关系。首先,更改int rowcount(const qmodelindex &parent)让模型可以正确的返回根节点数和子节点行数:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>int sqlmenuentry::rowcount(const qmodelindex &parent) const<br /> </li><li>{<br /></li><li>if(parent.isvalid()) //parent不为空,则要获取的行数是某个节点的子节点行数<br /></li><li>{<br /></li><li>treenodeptr parentnode = (treenodeptr)parent.internalpointer(); //节点信息在index时被保存在qmodelindex的internalpointer中<br /></li><li>return parentnode->childs.size();<br /></li><li>} </li><li>return mrootentrys.size(); //否则返回的是根节点行数<br /></li><li><br /></li><li>} </li></ol>
登录后复制


实现index接口函数,让模型可以返回子节点的modelindex同时将对应的节点指针保存在modelindex的internalpointer中:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>qmodelindex sqlmenuentry::index(int row, int column, const qmodelindex &parent) const<br /> </li><li>{<br /></li><li>if(!parent.isvalid()) //parent为空,返回的是根节点的modelindex,返回的同时,把节点数据指针(treenodeptr)保存在qmodelindex的internalpointer中,以便在其它函数中获取节点数据<br /></li><li>{<br /></li><li>if((row >= 0) && (row < mrootentrys.size()))<br /></li><li>{<br /></li><li>return createindex(row,column,mrootentrys.at(row)); <br /></li><li>}<br /></li><li>}else{<br /></li><li>treenodeptr parentnode = (treenodeptr)parent.internalpointer(); //返回子节点的modelindex<br /></li><li>return createindex(row,column,parentnode->childs[row]);<br /></li><li>}<br /></li><li>return qmodelindex();<br /></li><li>} </li></ol>
登录后复制
parent(const qmodelindex &child) 用于返回一个节点的父节点索引:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>qmodelindex sqlmenuentry::parent(const qmodelindex &child) const<br /> </li><li>{<br /></li><li>treenodeptr node = (treenodeptr)child.internalpointer();<br /></li><li>if(node->parent() == null)<br /></li><li>{<br /></li><li>return qmodelindex(); //根节点没有parent<br /></li><li>}else{<br /></li><li>return createindex(0,1,node->parent());<br /></li><li>} </li></ol>
登录后复制
实现data(constqmodelindex&index,introle) 返回节点中的数据:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>qvariant sqlmenuentry::data(const qmodelindex &index, int role) const<br /> </li><li>{<br /></li><li>treenodeptr node = (treenodeptr)index.internalpointer();<br /></li><li>return node->data(role);<br /></li><li>} </li></ol>
登录后复制

经过上面的打造,模型已经可以正常为treeview提供数据:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>treeview{<br /> </li><li>anchors.fill: parent<br /></li><li>tableviewcolumn {<br /></li><li>title: "name"<br /></li><li>role: "name"<br /></li><li>}<br /></li><li><br /></li><li>tableviewcolumn {<br /></li><li>title: "entry"<br /></li><li>role: "icon"<br /></li><li>}<br /></li><li>model:menuentrymodel{}<br /></li><li>} </li></ol>
登录后复制
继续干活去了,明天再继续补充数据添加、删除和更新的相关经验。







www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1120298.htmlTechArticle使用C++实现QML的TreeView Model (二) 上文已经介绍过二维表模型的实现方式,接着分享层次模型的实现,首先实现一个节点类用于保存树状数...
相关标签:
c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号