c/c++语言开发共享Qt QTreeWidget 树形结构实现代码

qt中实现树形结构可以使用qtreewidget类,也可以使用qtreeview类,qtreewidget继承自qtreeview类。树形效果如下图所示:这是怎么实现的呢?还有点击节点时会有相应的事件

qt中实现树形结构可以使用qtreewidget类,也可以使用qtreeview类,qtreewidget继承自qtreeview类。树形效果如下图所示:

Qt QTreeWidget 树形结构实现代码

这是怎么实现的呢?还有点击节点时会有相应的事件响应。

1. 树形结构实现

qt gui中有treewidget部件,将该控件在gui中布局好,假设其对象名为treewidget。

qtreewidget类官方文档:https://qt-project.org/doc/qt-4.8/qtreewidget.html

树形结构通过qtreewidget类和qtreewidgetitem类实现,qtreewidgetitem类实现结点的添加。上图代码实现如下:

  ui->treewidget->setcolumncount(1); //设置列数  ui->treewidget->setheaderlabel(tr("图像选择")); //设置头的标题    qtreewidgetitem *imageitem1 = new qtreewidgetitem(ui->treewidget,qstringlist(qstring("图像1")));  imageitem1->seticon(0,qicon("xxx.png"));  qtreewidgetitem *imageitem1_1 = new qtreewidgetitem(imageitem1,qstringlist(qstring("band1"))); //子节点1  imageitem1->addchild(imageitem1_1); //添加子节点    qtreewidgetitem *imageitem2 = new qtreewidgetitem(ui->treewidget,qstringlist(qstring("图像2")));  qtreewidgetitem *imageitem2_1 = new qtreewidgetitem(imageitem2,qstringlist(qstring("band1"))); //子节点1  qtreewidgetitem *imageitem2_2 = new qtreewidgetitem(imageitem2,qstringlist(qstring("band2"))); //子节点2  imageitem2->addchild(imageitem2_1);  //添加子节点  imageitem2->addchild(imageitem2_2);    ui->treewidget->expandall(); //结点全部展开

当然,还有其他的一些方法用于设置,具体需要时查查帮助文档学习。

除了使用上面这种方法之外,还可以使用qlist<qtreewidgetitem *> & items实现结点的添加。qt中对c++中的stl库中的容器使用进行了封装,使用其封装的类可以很方便的解决很多类似很复杂数据结构的问题。实现如下:

  //只写结点的实现  qlist<qtreewidgetitem *> rootlist;    qtreewidgetitem *imageitem1 = new qtreewidgetitem;   //添加第一个父节点  imageitem1->settext(0,tr("图像1"));  rootlist.append(imageitem1);    qtreewidgetitem *imageitem1_1 = new qtreewidgetitem(imageitem1,qstringlist(qstring("band1"))); //添加子节点  imageitem1->addchild(imageitem1_1);    qtreewidgetitem *imageitem2 = new qtreewidgetitem;   //添加第二个父节点  imageitem2->settext(0,tr("图像2"));  rootlist.append(imageitem2);    qtreewidgetitem *imageitem2_1 = new qtreewidgetitem(imageitem2,qstringlist(qstring("band1")));  //添加子节点  qtreewidgetitem *imageitem2_2 = new qtreewidgetitem(imageitem2,qstringlist(qstring("band2")));  imageitem2->addchild(imageitem2_1);  imageitem2->addchild(imageitem2_2);    ui->treewidget->inserttoplevelitems(0,rootlist);  //将结点插入部件中    ui->treewidget->expandall(); //全部展开

2. 点击节点的事件响应

首先想到有没有点击某个节点的信号,查看文档,有一个void itemclicked ( qtreewidgetitem * item, int column )信号,是双击某个节点的信号,将该信号与某个自定义槽相连,当双击节点时触发槽函数。

看一下这个信号,第一个参数为点击的qtreewidgetitem类对象,第二个参数为节点所在列号。

思路:根据点击的qtreewidgetitem类对象可以通过parent()函数得到父节点,如果qtreewidgetitem类对象就是最最顶端的节点时,parent()函数返回的就是null。通过insertchildren ( int index, const qlist<qtreewidgetitem *> & children )函数可以得到该节点在父节点中的索引值。

目前只能解决只有一个最顶端父节点时的事件响应,当最顶端的父节点有多个(比如c/c++开发分享Qt QTreeWidget 树形结构实现代码开头有2个),这时点击子节点时,无法判断子节点的父节点是哪一个(本人愚笨啊!),因此没法为其槽函数执行相应的操作。

这里就以一个分支为例。

  private slots:        void showselectedimage(qtreewidgetitem * item, int column); //点击树节点事件        connect(ui->treewidget,signal(itemdoubleclicked(qtreewidgetitem*,int)),this,slot(showselectedimage(qtreewidgetitem*,int)));        void mainwindow::showselectedimage(qtreewidgetitem *item, int column)    {        qtreewidgetitem *parent = item->parent();        if(null==parent) //注意:最顶端项是没有父节点的,双击这些项时注意(陷阱)           return;       int col = parent->indexofchild(item); //item在父项中的节点行号(从0开始)          if(0==col) //band1       {           //执行对应操作       }       if(1==col) //band2       {           //执行对应操作       }   }

如果不加父节点是否为空的判断,当节点有父节点时,不会出错,当节点没有父节点时,程序会出错(运行错误),判断之后,双击没有父节点的节点就会是树的收缩操作。

转载地址:https://www.cnblogs.com/romi/archive/2012/04/16/2452709.html

到此这篇关于qt qtreewidget 树形结构实现代码的文章就介绍到这了,更多相关qt qtreewidget 树形结构内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享Qt QTreeWidget 树形结构实现代码,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/965400.html

(0)
上一篇 2021年12月2日
下一篇 2021年12月2日

精彩推荐