QTreeWidget使用

为什么不能通过这篇文章,直接玩转 QTreeWidget 树桩窗体呢?

简介

操作系统:window7 x64

编程IDE:Qt Creator 4.2.1

Qt版本:5.8.0

最后更新日期:2017年5月3日

版权所有:_OE_, 转载请注明出处:http://blog.csdn.net/csnd_ayo

基础

这里只负责基础的内容,最浅显,最常用的内容。

树状列表的创建

  • 关联

该类的关联头文件, 别觉得谁都知道,有不知道的人,我说真的。

    #include <QTreeWidget>
  
  
  • 1
  • 光膀子的列表
    包含了头文件以后,我们通过下面的这句话就可以建出一个啥也没有的列表了,虽然这个列表看起来还很可笑。

  •     QTreeWidget* tree = new QTreeWidget();
        tree->show();
      
      
    • 1
    • 2

    这里写图片描述

    别瞧他现在还是个四不像,这胚子已经出来了,树状列表还远吗?
    这里的 1 是这个树状图的标题,我们暂时先不用理会他。

  • 穿上列表的衣服

  • 我们来认识下一个至关重要的类。

    QTreeWidgetItem 显然他的名字就已经说明了他的作用,我们想要插入一条一条的数据都要通过这个类。

    /**
     * @brief : 构造函数 - 生成一个子项
     * @param : view 关联的窗体,或译父节点
     * @param : strings 列(column)数据 (后面会细讲)
     * @param : type 暂时不用理会
    */
    QTreeWidgetItem(QTreeWidget *view, 
        const QStringList &strings, int type = Type);
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们来建立我们自己的列表

    QTreeWidget* tree = new QTreeWidget();
    tree->show();
    //添加一级节点
    QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
                           QStringList(QString("num_1")));
    QTreeWidgetItem *items2 = new QTreeWidgetItem(tree,
                           QStringList(QString("num_2")));
    QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
                           QStringList(QString("num_3")));
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里写图片描述

    我们的树列就有了,一个for,我们想有多少行就有多少行了。
    至此,基础的列表显示就已经齐全了。

    树状列表的删除

    • 野蛮的 delete

    树状列表的删除其实很有趣,一个 delete 就搞定了,尽管这样很不优雅。

    这里写图片描述

    原因也很简单,一个 delete 触发了析构函数。

    我说他野蛮的原因是,我们不可能在程序复杂的运行过程中还保留曾经的变量 items2 item3….

    所以这样的写法,只能被看成野蛮,无脑。

  • 如何优雅?

  • 
    QTreeWidget* tree = new QTreeWidget();
    tree->show();
    //添加一级节点
    QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
                                QStringList(QString("num_1")));
    QTreeWidgetItem *items2 = new QTreeWidgetItem(tree,
                                QStringList(QString("num_2")));
    QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
                                QStringList(QString("num_3")));
    tree->takeTopLevelItem(1);
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    嘿嘿,这里的函数名 takeTopLevelItem 已经阐述了他的作用,拿走顶级的项。
    index 是下标,我们这里给了 1 你们可以想想,这里哪个子项会消失。

  • 最常用的删除

  • 我们一般删除某个项,都是由用户通过鼠标指定的,所以我们其实可以通过相应特定的事件(例:右键菜单,delete keydown)。

    // 通过这个函数获得当前选中的项
    QTreeWidget* tree = new QTreeWidget();
    tree->currentItem();
      
      
    • 1
    • 2
    • 3

    若currentItem 返回空,则意味着没有选中该列表中的子项。

    树状图的查找

    • 众里寻他千百度 删他只需一抽搐

    QTreeWidget* tree = new QTreeWidget();
    tree->show();
    //添加一级节点
    QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
                                QStringList(QString("num_1")));
    QTreeWidgetItem *items2 = new QTreeWidgetItem(tree,
                                QStringList(QString("num_1")));
    QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
                                QStringList(QString("num_3")));
    // 查找 与 num_1 完全一致的项,并返回。
    QList<QTreeWidgetItem*> s = tree->findItems("num_1", Qt::MatchFlag::MatchExactly);
    // 无情删除
    for (auto item : s) {
        delete item;
    }
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    深入

    多级树状图

    多级树状图,其实也很好理解,就是把父节点换掉嘛,谁是父节点,那么Item项就挂载在谁的下面。

    暂无介绍

    QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
                                 QStringList(QString("num_13")));
    
    QTreeWidgetItem *item104 = new QTreeWidgetItem(items3,
                                QStringList(QString("item104")));
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    层次都是按照这个套路来的,多级树状图油然而生。

    多列树状图

    暂无信息
    
      
      
    • 1

    简单的自定义

    使用这个函数的时候,需要在全局或类内定义一个变量
    QMap<QString, QTreeWidgetItem*> itemMap_ , 他记录着所有树列的唯一键值,记住是唯一。

        /**
         * @brief : 添加子项到树中
         * @param : item 项的内容
         * @param : parentKey 他的父级节点的唯一标识
         * @param : theKey 他的节点唯一标识
        */
        int CustomTreeWidget::addItem(QStringList item, QString parentKey, QString theKey) {
        QTreeWidgetItem* temp_item;
        /// 生成到父级节点下
        QMap<QString,QTreeWidgetItem*>::iterator iter_item = itemMap_.find(parentKey);
        if (iter_item == itemMap_.end()) {
            temp_item = new QTreeWidgetItem(this, item);
        }
        else {
            temp_item = new QTreeWidgetItem(iter_item.value(), item);
        }
        /// 判断
        if (!theKey.isEmpty()) {
            itemMap_.insert(theKey,temp_item);
        }
    }
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这里写图片描述

    这里只是简单的给大家一个思路,大家放胆去继承QTreeWidget类,发挥想象读取干吧。

    比如通过某个值获得这个项,结合上面的基础,已经可以做很多事情啦,不是吗?

    列表头的操作

    • 表头操作
    /**
     * @brief : 表头的隐藏
     * @param : hide  [true : 隐藏表头 false : 显示表头]
     */
    void QTreeView::setHeaderHidden(bool hide);
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    这里写图片描述

    • 设置表头
    /**
     * @brief :  设置表头内容
     * @param : item 具体的item项
     */
    void QTreeView::setHeaderItem(QTreeWidgetItem *item);
    // 也可以直接给文字
    void setHeaderLabels(const QStringList &labels);
    inline void setHeaderLabel(const QString &label);
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    会说话的颜色

    这里写图片描述

        QStringList head;
        head << "姓名";
        QTreeWidget* tree = new QTreeWidget();
        tree->show();
        // 设置表头
        tree->setHeaderLabels(head);
        // 添加一级节点
        head.clear();
        head << "王根基";
        QTreeWidgetItem *items1 = new QTreeWidgetItem(tree,
                                    head);
        head.clear();
        head << "李大锤";
        QTreeWidgetItem *items3 = new QTreeWidgetItem(tree,
                                    head);
        /// 设置背景颜色
        items3->setBackground(0,QBrush(Qt::green));
        head.clear();
        head << "李思基(非亲生)";
        QTreeWidgetItem *item104 = new QTreeWidgetItem(items3,
                                    head);
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    太晚了,这里还没有更新,抱歉。

    暂无介绍
    
      
      
    • 1

    QTreeWidget 的新装

    暂无介绍
    
      
      
    • 1
    					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7b4cdcb592.css" rel="stylesheet">
                </div>
    

    猜你喜欢

    转载自blog.csdn.net/weixin_39485901/article/details/88372969