QT学习之[QTreeWidgetItem]详解,示例

这篇具有很好参考价值的文章主要介绍了QT学习之[QTreeWidgetItem]详解,示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QTreeWidgetItem

树形控件,当选中顶层树形节点时,子节点全部被选中,当取消选择顶层数节点时,子节点全部被取消,当选中子节点时候,父节点显示被选中,示例如下:

用法以及API详解如图:

图片qtreewidgetitem,QT,qt,学习,ui,c++
qtreewidgetitem,QT,qt,学习,ui,c++

第一步:

双击UI文件选择,打开ui设计器,拖拽一个Tree Widget 控件,文章来源地址https://www.toymoban.com/news/detail-597482.html

第二步:

在.h头文件中添加代码:

#include <QTreeWidgetItem>

在widget声明处添加代码:

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void init();
    void updataParentItem(QTreeWidgetItem* item);
private slots:
    void treeItemChanged(QTreeWidgetItem* item,int column);
private:
    QTreeWidgetItem* group1;
    QTreeWidgetItem* group2;
    QTreeWidgetItem* group3;
    QTreeWidgetItem* subItem1;
    QTreeWidgetItem* subItem2;
    QTreeWidgetItem* subItem3;
    QTreeWidgetItem* subItem4;
    QTreeWidgetItem* subItem5;
    QTreeWidgetItem* subItem6;
    QTreeWidgetItem* subItem7;
    QTreeWidgetItem* subItem8;
    QTreeWidgetItem* subItem9;

在widget构造函数添加代码:


 //初始化页面
    init();
    //发射信号接受相应
    connect(ui>treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
}

init():

void Widget::init()
{
    ui->treeWidget->clear();
    //第一个分组
   group1 = new QTreeWidgetItem(ui->treeWidget);
   group1->setText(0,"group1");
   group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   group1->setCheckState(0,Qt::Unchecked);

   subItem1 = new QTreeWidgetItem(group1);
   subItem1->setText(0,"subItem1");
   subItem1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem1->setCheckState(0,Qt::Unchecked);

   subItem2 = new QTreeWidgetItem(group1);
   subItem2->setText(0,"subItem2");
   subItem2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem2->setCheckState(0,Qt::Unchecked);

   subItem3 = new QTreeWidgetItem(group1);
   subItem3->setText(0,"subItem3");
   subItem3->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem3->setCheckState(0,Qt::Unchecked);

   subItem4 = new QTreeWidgetItem(group1);
   subItem4->setText(0,"subItem4");
   subItem4->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem4->setCheckState(0,Qt::Unchecked);
    //分组2

   group2 = new QTreeWidgetItem(ui->treeWidget);
   group2->setText(0,"group2");
   group2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   group2->setCheckState(0,Qt::Unchecked);

   subItem5 = new QTreeWidgetItem(group2);
   subItem5->setText(0,"subItem5");
   subItem5->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem5->setCheckState(0,Qt::Unchecked);

   subItem6 = new QTreeWidgetItem(group2);
   subItem6->setText(0,"subItem6");
   subItem6->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem6->setCheckState(0,Qt::Unchecked);

   subItem7 = new QTreeWidgetItem(group2);
   subItem7->setText(0,"subItem7");
   subItem7->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem7->setCheckState(0,Qt::Unchecked);

   subItem8 = new QTreeWidgetItem(group2);
   subItem8->setText(0,"subItem8");
   subItem8->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
   subItem8->setCheckState(0,Qt::Unchecked);
}

updataParentItem():

void Widget::updataParentItem(QTreeWidgetItem *item)
{
    QTreeWidgetItem* parent = item->parent();
    if(parent == NULL)
    {
        return;
    }

    int selectedCount = 0;
    int ChildCount = parent->childCount();
    for (int i = 0;i < ChildCount; i++) {
        QTreeWidgetItem* childItem = parent->child(i);
        if(childItem->checkState(0) == Qt::Checked)
        {
            selectedCount++;
        }
    }
    if(selectedCount <= 0)
    {
        //未选中
        parent->setCheckState(0,Qt::Unchecked);
    }
    else if(selectedCount > 0 && selectedCount < ChildCount)
    {
        //部分选中
        parent->setCheckState(0,Qt::PartiallyChecked);
    }
    if(selectedCount == ChildCount)
    {
        //全选中
        parent->setCheckState(0,Qt::Checked);
    }

}

treeItemChanged():

//QTreeWidgetItem自带的信号changItem两个参数,所以这里槽函数也有两个参数
void Widget::treeItemChanged(QTreeWidgetItem *item,int column)
{
    QString itemText = item->text(0);

    //选中时候未点击
    if(Qt::Checked == item->checkState(0))
    {
        //QTreeWidgetItem* parent = item->parent();
        int count = item->childCount();
        if(count > 0)
        {
            for (int i = 0;i < count;i++) {
                //子节点选中
                item->child(i)->setCheckState(0,Qt::Checked);
            }
        }
        else
        {
            //是子节点
           updataParentItem(item);
        }

    }
    else if (Qt::Unchecked == item->checkState(0))
    {
        int count = item->childCount();
        if(count > 0)
        {
            for (int i = 0;i < count;i++) {
                //子节点选中
                item->child(i)->setCheckState(0,Qt::Unchecked);
            }
        }
        else
        {
           updataParentItem(item);
        }
    }

}

到了这里,关于QT学习之[QTreeWidgetItem]详解,示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT学习之定时器

    一、定时器 第一种方式: 1 利用事件 void timerEvent ( QTimerEvent * ev) 2 启动定时器 startTimer( 1000) 毫秒单位 3 timerEvent 的返回值是定时器的唯一标示 可以和ev-timerid 做比较 第二种方式: 1 利用定时器类 QTimer 2 创建定时器对象 QTimer * timer = new QTimer(this) 3 启动定时器 timer-start(毫秒)

    2024年02月16日
    浏览(44)
  • Qt 拖拽事件示例

    拖拽这个动作,在桌面应用程序中是非常实用和具有很友好的交互体验的。我们常见的譬如有,将文件拖拽到某个窗口打开,或者拖拽文件到指定位置上传;在绘图软件中,选中某个模板、并拖拽到画布上,画布上变回绘制该模板的图像… 诸如此类,数不胜数。 那么,在Q

    2024年01月25日
    浏览(35)
  • Qt栅格布局的示例

    这样写程序会崩溃的: 因为QLabel的生存周期太短了。

    2024年04月13日
    浏览(40)
  • Qt线程池QThreadPool使用示例

    前言 线程池顾名思义就是同时管理多个线程的\\\"池子\\\",它是一种并发处理技术,在程序中使用线程池能够提高线程的使用效率,提高程序的稳定性。 本文从线程池的实现原理开始,介绍了QT框架里的线程池QThreadPool,并提供一个使用示例。 1.线程池原理介绍 线程池的实现思路

    2024年02月07日
    浏览(38)
  • Qt中实时更新UI程序示例

    Qt在运行时会开启一个主线程,如果没有开启工作线程的话,所有界面上的操作都是在主线程,包括更新界面或者处理数据等操作。我们都知道如果处理数据比较多的话,最好是在单独开启一个线程来处理数据,这样就不会影响主线程的运行。 Windows系统:Windows10 Qt版本:Qt

    2023年04月08日
    浏览(43)
  • QT webengine显示HTML简单示例

    QT webengine显示HTML简单示例 编译器 : Desktop Qt 5.15.2 MSVC2019 64bit 编辑器: QtCreator 代码: 编译器 : Desktop Qt 5.15.2 MSVC2019 64bit 编辑器: QtCreator 代码:

    2024年04月17日
    浏览(29)
  • QT各种控件常用样式表qss示例

    目录 1、表格控件QTableWidget和QTableView 2、滚动条QScrollBar 这个控件比较复杂,里面包含了滑动条、表头(又细分为内容区/空白区)、表格、整体、左上角按钮等多种不同的元素,他们之间有复杂的叠层关系。需要通过各种“选择器”来指定样式的作用范围。 本文由【暴躁的野

    2024年02月16日
    浏览(46)
  • Qt开发1--QCustomPlot的第一个示例

    本文记录了在Linux上使用QCustomPlot进行一个基本绘制所需的完整过程,包括如何使用qtcreator,编辑ui以及编写相应的C++代码。以下是详细步骤: 1、使用qtcreator启动开发环境: 启动后,显示以下一个操作界面:  2、通过菜单栏File-New File or Project启动项目新建向导: 3、选择App

    2024年02月11日
    浏览(42)
  • 界面开发框架Qt - 组合小部件映射器示例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 Combo Widget Mapper(组合小部件映射器)示例展示了如何

    2023年04月14日
    浏览(46)
  • Qt/QML编程之路:OpenGL的示例(39)

    Qt编程之后,会发现有版本问题,有时候一个示例不同的版本下可能会跑不同,有些Qt5跑不同Qt6已经完善,可以跑通。 我就看到有个关于OpenGL的示例: 这个示例是演示怎么基于OpenGL编程的,但是调试时却发现glViewXXX等gl打头的函数说找不到reference,或者什么link不上之类的错误

    2024年01月19日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包