查看完整版本: [-- 自定义树形结构导航栏 --]

QTCN开发网 -> Qt 作品展 -> 自定义树形结构导航栏 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

sssooonnnggg 2015-01-26 10:49

自定义树形结构导航栏

应网友 @heartlessjun 要求,将项目中实现的树形结构导航栏的源码剥离出来,与各位分享。

树形结构的数据通过读取xml文件来获取,xml文件结构如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
    <root>
        <layout>
            <Node label="基本信息"></Node>
            <Node label="密码信息" count="100"></Node>
            <Node label="内置应用" collapse="0">
                <Node label="短信" count="1000"></Node>
                <Node label="通讯录" count="256"></Node>
                <Node label="通话记录" count="20"></Node>
            </Node>
            <Node label="社交应用" collapse="0">
                <Node label="QQ" count="231"></Node>
                <Node label="微信"></Node>
            </Node>
            <Node label="浏览器" collapse="0">
                <Node label="系统浏览器" count="99"></Node>
                <Node label="UC浏览器" count="66"></Node>
                <Node label="QQ浏览器" count="2"></Node>
                <Node label="百度浏览器" count="123"></Node>
                <Node label="猎豹浏览器" ></Node>
            </Node>
            <Node label="模拟仿真">
            </Node>
            <Node label="镜像分析">
            </Node>
        </layout>
    </root>

collapse 代表父节点初始化时是否展开, count 代表节点中 tag 显示的数字, 0 为不显示

使用了 item/view/delegate 来实现自定义的导航栏,详见源码

http://download.csdn.net/detail/sssooonnnggg/8396829

效果:

[attachment=13160]


[attachment=13161]



sssooonnnggg 2015-01-26 10:52
[attachment=13162]

在项目中的使用效果

toby520 2015-01-26 11:05
不错 做的 加油吧 分享更多 更好的

xsjqqq123 2015-01-26 13:10
取证工具是什么?我将做一个linux上手机管理的,和你这个有几分相似,导航栏就不客气地收下了,话说,你那个分区大小是如何得到的?adb似乎没这样的功能吧

sssooonnnggg 2015-01-26 13:38
xsjqqq123:取证工具是什么?我将做一个linux上手机管理的,和你这个有几分相似,导航栏就不客气地收下了,话说,你那个分区大小是如何得到的?adb似乎没这样的功能吧 (2015-01-26 13:10) 

linux大部分命令都可以通过adb 来调用,分区大小可以用 adb shell df 来看

zjmmlab 2015-01-26 16:39
感谢分享

下载源码编译运行到这里总是无法得到正确的 node 指针,调试看到 node 中都是无效的地址:

NavModel::TreeNode* node = (NavModel::TreeNode*)index.data(Qt::UserRole).toUInt();


后稍作修改:


NavModel::TreeNode* node = index.data(Qt::UserRole).value<NavModel::TreeNode*>();

相应的 NavModel 类的函数也修改如下:
QVariant NavModel::data(const QModelIndex &index, int role) const
{
    ...
    ...
    if (role == QT::DisplayRole)
        return m_list[index.row()].label;
    else if (role == Qt::UserRole)
        return QVariant::fromValue(m_list[index.row()].treeNode);
    ....
}
这样即可正常运行。楼主原来的方法是将 treeNode 指针转换为 unsigned int 再放到 QVariant 中传回,使用时先 QVariant::toUInt() 再强制类型转换为地址,这种方法不知是否可行,在我的电脑上总是出错(WIN8.1 + Qt5.3.2 + VS2013)。

qhxnwrz 2015-01-26 18:35
感谢分享

咬蚊嚼渍 2015-01-26 20:44
mark一个,
非常感谢分享,如果我以后会用到,肯定会在代码里标记你的ID的,再次感谢

liudianwu 2015-01-27 08:57
真心不错,谢谢分享!

morg 2015-01-27 17:39
谢谢,挺好用。调整到了Qt5并加了hover row功能(原mouse move hover row好像没有起作用)。请大家继续完善。[attachment=13180]


sssooonnnggg 2015-01-28 10:09
我的开发环境是4.8,使用5.0进行开发的兄弟可以使用楼上修改过的代码

liudianwu 2015-01-28 10:11
sssooonnnggg:
我的开发环境是4.8,使用5.0进行开发的兄弟可以使用楼上修改过的代码

楼上的忘记把config.xml打包进去了![attachment=13187]

圣域天子 2015-01-28 10:24
能做成控件,就最好了

咬蚊嚼渍 2015-02-01 17:07
这个导航条,我试着用QTreeWidget来实现,现在可以做成这个样子:
[attachment=13220]
有些是用QSS写的样式,有些是直接在QT设计师里改属性的。
现在感觉到了这个步,如果想加一些图片到QTreeWidget的item里面,
是不是需要用到模型视图才行?QT文档里的qss说明说得不太清楚,
不少东西没法用qss改。
有大神可以帮忙改改就好了。

sssooonnnggg 2015-02-02 19:49
咬蚊嚼渍:这个导航条,我试着用QTreeWidget来实现,现在可以做成这个样子:
[图片]
有些是用QSS写的样式,有些是直接在QT设计师里改属性的。
现在感觉到了这个步,如果想加一些图片到QTreeWidget的item里面,
是不是需要用到模型视图才行?QT文档里的qss说明说得不太清楚,
... .. (2015-02-01 17:07)

想要加图标到 item 里面,直接调用 QTreeWidgetItem 的 setIcon 就可以了,但是无法根据目标当前的状态来切换图标。比如我希望当 item 选中时图标是白色的,不选中时图标是黑色的,这种需求无法通过纯 qss 来实现。

通过继承 QItemDelegate ,重写 paint 函数,实现的导航栏就比较灵活了,想怎么画就怎么画

xinlanbobo 2015-03-05 11:39
谢谢分享

zichuangyang 2015-03-06 17:16
  

zhangzhenti 2015-04-10 16:13
牛逼,不错啊

傲天雪 2015-05-13 09:43
真心不错

fly_fine 2015-05-13 09:52
如果导航栏列表的数据不固定,是从数据库获取的,能够实时更新吗?

heartlessjun 2015-06-09 17:26
你这 确实是个好思路,调取XML实现,我用QTreeWidget  实现的,加了些美化,还是谢谢你。。。。学习了!

liyiq_82 2015-07-18 22:37
您好,楼主。你给的是最多2级菜单,我把代码下载下来后,怎么都实现不了三级菜单,求解

toby520 2015-07-21 21:32
mac下面直接崩溃

wang17321 2015-07-21 22:49
楼主能把修改后的源代码发出来,让我们这些菜鸟学习吗?

liyiq_82 2015-07-22 08:56
现在我想把线条变细,但是无论怎么调,最底部的那条线还是比其他线更粗,楼主能否告知下怎么解决

371933024 2015-10-12 14:30
在网上找了好几天没有找到这种效果,多谢楼主!!!

xyinfotech01 2015-11-17 18:10
真心好东西,学习了

thomye 2016-02-02 16:29
楼主,你好,我想请教一下,通过什么方法,点击导航就出现对应的窗口

pamxy 2016-02-04 20:06
根据5楼兄台修改了的,QT5能够运行,也用VS2013编译过的版本
[attachment=14786]

hunterzf 2016-09-22 18:12
谢谢楼主,正在做这么个东西

hunterzf 2016-09-23 15:40
楼主,真是谢谢了

yyzq 2016-09-24 22:31
感觉像是遇到熟人了,TJ。。。。。。。。。。

liudianwu 2016-11-11 13:21
更新过一个版本:
* 1:合并成一个文件
* 2:隐藏多余接口,只保留readData函数接口
* 3:修正重复加载数据BUG及关闭时有时候崩溃的BUG
* 4:修正当范围值中最小值为负数时的bug
* 5:增加默认支持鼠标悬停
* 6:增加一些完整性校验
* 7:增加设置各种颜色
* 8:+-伸缩图形改成绘制,同时支持+-图形及三角形图形
* 9:增加setData数据接口,使之同时支持字符串链表作为数据源
* 10:增加设置分割线条是否可见
* 11:增加设置伸缩图片采用何种颜色
* 12:改进分割线条高度
* 13:将显示未读条数部分改成提示信息,可以是字符串
*/
[attachment=15993]
[attachment=15994]
源码下载:[attachment=15995]

return 2016-11-21 11:59

请叫我乔帮主 2016-12-06 17:31
收了,多谢

lxiaohai 2016-12-08 15:47
为什么多级,如3级或者4级就无效了?

liuzhezhe 2017-07-19 15:08
    

tiangao 2017-07-20 14:01
为什么我下载了提示文件被破坏?

紫月清风 2017-07-31 17:31
[attachment=17594]
为什么我出现了很多外部链接错误

hunt978 2017-09-13 15:30
紫月清风:[图片]
为什么我出现了很多外部链接错误 (2017-07-31 17:31) 

编译需要QtXml依赖包

手机号 2018-04-24 20:54
qml树形结构

liugq74 2019-05-17 09:38
:-1: error: cannot find -lkernel32

请问各位大侠这个报错是什么原因呢?谢谢

my2019 2019-05-21 20:09
能否发份给我,你CSDN要46分,太多了,没有积分。

my2019 2019-05-21 20:13
能否发份给我学习一下,my163mail2019@163.com,谢谢!

beijixinghuo 2019-07-01 20:25
厉害了,谢谢分享

1159578622 2019-11-19 01:15
NavModel::TreeNode* node = (NavModel::TreeNode*)index.data(Qt::UserRole).toUInt();
我也碰到这个问题 利用5楼给的方法 仍然报错
最后解决方法:
class NavModel : public QAbstractListModel
{
    .........
};
这个类后面加 这么四行
Q_DECLARE_METATYPE(NavModel::TreeNode);
Q_DECLARE_METATYPE(NavModel::ListNode);
Q_DECLARE_METATYPE(NavModel::TreeNode*);
Q_DECLARE_METATYPE(NavModel::ListNode*);
自定义结构需要注册 才能被元对象系统识别

cynthia~ 2021-10-13 10:19
liudianwu:更新过一个版本:
* 1:合并成一个文件
* 2:隐藏多余接口,只保留readData函数接口
* 3:修正重复加载数据BUG及关闭时有时候崩溃的BUG
* 4:修正当范围值中最小值为负数时的bug
....... (2016-11-11 13:21) 

大侠能有完整的源码嘛,万分感谢

fanstar 2021-12-31 22:24
请问,我在我的设计器 里面没找到navview控件,我复制过去,结果代码不报错,就是不显示(空白,但是有底色),这个 该怎么解决啊?


查看完整版本: [-- 自定义树形结构导航栏 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled