• qt QTreeWidget 学习


    树形控件的节点可以有多层、多个子节点, 如果将子节点全部展开,那么每一行都是一个数据条目。QTreeWidgetItem 比较特殊,一个条目内部可以有多列数据信息,相当于表格控件一整行的表格单元集成为一个条目。

     默认情况下,树形控件最上面是一个树头条目,树头条目也是 QTreeWidgetItem 对象,可以有多列内容。

    树头下面是真正的树形控件所有条目,在折叠的情况下,如上图所示,每行一个顶级条目,顶级条目也是 QTreeWidgetItem 对象,顶级条目的父节点指针 QTreeWidgetItem::​parent() 为 NULL

    QTreeWidget

    顶级条目进行计数

    int QTreeWidget::​topLevelItemCount() const

    获取顶级条目

    QTreeWidgetItem *topLevelItem(int index) const;

    添加顶级条目

    void addTopLevelItem(QTreeWidgetItem *item);

    移除顶级条目

    QTreeWidgetItem *takeTopLevelItem(int index);

    清空所有的顶级条目和子条目

     void clear();

    获取当前高亮选中条目的函数为

     QTreeWidgetItem *currentItem() const;

    设置某个条目为当前选中的状态

    void setCurrentItem(QTreeWidgetItem *item);

    当前高亮选中的状态发生变化,会触发如下信号

    void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);

    QTreeWidgetItem

    获取某列的数据

    QString text(int column)

    virtual QVariant data(int column, int role) const;

    设置某列的数据

    void setText(int column, const QString &text)

    virtual void setData(int column, int role, const QVariant &value);

    获取某列图标

    inline QIcon icon(int column) const

    设置某列图标

    inline void setIcon(int column, const QIcon &icon);

    添加子项

    void addChild(QTreeWidgetItem *child);

    void addChildren(const QList &children);

    当前条目的操作

    QTreeWidgetItem *currentItem() const;   //获取当前高亮选中条目

    int currentColumn() const;   //当前条目被点击选中的列号

    void setCurrentItem(QTreeWidgetItem *item); //设置某个条目为当前选中的状态

    常用的信号

    如果当前高亮选中的状态发生变化

    void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);

    void itemActivated(QTreeWidgetItem * item, int column) //条目列被激活

    void itemChanged(QTreeWidgetItem * item, int column)   //条目列的数据发生变化,比如文本或图标修改了

    void itemClicked(QTreeWidgetItem * item, int column)  //条目列被单击

    void itemDoubleClicked(QTreeWidgetItem * item, int column) //条目列被双击

    void itemEntered(QTreeWidgetItem * item, int column) //进入条目列

    void itemPressed(QTreeWidgetItem * item, int column) //条目列被点击按下

    void QTreeWidget::​itemExpanded(QTreeWidgetItem * item)  //条目展开时发送信号

    void QTreeWidget::​itemCollapsed(QTreeWidgetItem * item) //条目折叠时发送信号

    代码例子

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include <QWidget>
    4. #include <QTreeWidget>
    5. QT_BEGIN_NAMESPACE
    6. namespace Ui { class Widget; }
    7. QT_END_NAMESPACE
    8. class Widget : public QWidget
    9. {
    10.     Q_OBJECT
    11. public:
    12.     Widget(QWidget *parent = nullptr);
    13.     ~Widget();
    14.     void createtree();
    15.     QTreeWidget *tree;
    16. public slots:
    17.     void curItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
    18.     void itemselected(QTreeWidgetItem *item,int column);
    19. public:
    20.     void setselected(QTreeWidgetItem *item,Qt::CheckState state);
    21. private:
    22.     Ui::Widget *ui;
    23. };
    24. #endif // WIDGET_H
    25. #include "widget.h"
    26. #include "ui_widget.h"
    27. #include <QDebug>
    28. Widget::Widget(QWidget *parent)
    29.     : QWidget(parent)
    30.     , ui(new Ui::Widget)
    31. {
    32.     ui->setupUi(this);
    33.     createtree();
    34. }
    35. Widget::~Widget()
    36. {
    37.     delete ui;
    38. }
    39. void Widget::createtree()
    40. {
    41.     tree = new QTreeWidget(this);
    42.     tree->resize(400, 300);  // 设置控件大小为 400 x 300
    43.     tree->move(100, 100);    // 设置控件在窗口中的位置为 (100, 100)
    44.     tree->setColumnCount(2);                           // 设置列数为 2
    45.     tree->setHeaderLabels({"Name", "Value"});          // 设置列标题为 "Name""Value"
    46.     QTreeWidgetItem *root = new QTreeWidgetItem(tree);   // 创建一个根节点
    47.     root->setText(0, "Root");                            // 设置节点文本
    48.     root->setText(1, "0");                               // 设置节点文本
    49.     root->setCheckState(0,Qt::Checked);
    50.     tree->addTopLevelItem(root);                         // 将节点添加到 QTreeWidget 中
    51.     QTreeWidgetItem *child1 = new QTreeWidgetItem(root); // 创建一个子节点
    52.     child1->setText(0, "Child 1");                       // 设置节点文本
    53.     child1->setText(1,"10"); // 设置节点文本''
    54.     child1->setCheckState(0,Qt::Checked);
    55.     root->addChild(child1); // 将节点添加到根节点下
    56.     QTreeWidgetItem *child11 = new QTreeWidgetItem(child1); // 创建一个子节点
    57.     child11->setText(0, "Child 11");                       // 设置节点文本
    58.     child11->setText(1,"100"); // 设置节点文本''
    59.     child11->setCheckState(0,Qt::Checked);
    60.     child1->addChild(child11); // 将节点添加到根节点下
    61.     QTreeWidgetItem *child2 = new QTreeWidgetItem(root); // 创建一个子节点
    62.     child2->setText(0, "Child 2");                       // 设置节点文本
    63.     child2->setText(1,"20"); // 设置节点文本
    64.     child2->setCheckState(0,Qt::Checked);
    65.     root->addChild(child2); // 将节点添加到根节点下
    66.     connect(tree,SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem*)),this,SLOT(curItemChanged(QTreeWidgetItem *, QTreeWidgetItem*)));
    67.     connect(tree,SIGNAL(itemClicked(QTreeWidgetItem *,int)),this,SLOT(itemselected(QTreeWidgetItem *,int)));
    68.     tree->show();
    69. }
    70. void Widget::curItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
    71. {
    72.     if(current != nullptr)
    73.     {
    74.          qDebug() << current->text(0);
    75.     }
    76. }
    77. void Widget::itemselected(QTreeWidgetItem *item,int column)
    78. {
    79.     if(column == 0)
    80.     {
    81.         Qt::CheckState state = item->checkState(0);
    82.         if(state == Qt::Checked || state == Qt::Unchecked)
    83.         {
    84.             setselected(item,state);
    85.         }
    86.     }
    87. }
    88. void Widget::setselected(QTreeWidgetItem *item,Qt::CheckState state )
    89. {
    90.     int ncount = item->childCount();
    91.     for(int i = 0; i <ncount; i++)
    92.     {
    93.         QTreeWidgetItem *child = item->child(i);
    94.         child->setCheckState(0,state);
    95.         if(child->childCount() > 0)
    96.             setselected(child,state);
    97.     }
    98. }

  • 相关阅读:
    Golang 中的调试技巧
    UE源码分析:Slate 鼠标/触摸输入处理
    svg常用属性及动画效果
    读书笔记:Java8 Streams用法总结大全 之 Stream中的常见操作
    Spark新特性与核心概念
    SpringBoot整合Spring Security【超详细教程】
    Masked Relation Learning for DeepFake Detection
    Google Earth Engine(GEE)——join连接在GEE中的应用(同一sentinel-2影像集合)含滑动窗口平滑影像过程
    Go Quiz: 从Go面试题看recover注意事项第1篇
    【硬件架构的艺术】学习笔记(4)流水线的艺术
  • 原文地址:https://blog.csdn.net/baidu_16370559/article/details/138189177