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<QTreeWidgetItem*> &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) //条目折叠时发送信号

代码例子

#ifndef WIDGET_H

#define WIDGET_H



#include <QWidget>

#include <QTreeWidget>

QT_BEGIN_NAMESPACE

namespace Ui { class Widget; }

QT_END_NAMESPACE



class Widget : public QWidget

{

    Q_OBJECT



public:

    Widget(QWidget *parent = nullptr);

    ~Widget();



    void createtree();

    QTreeWidget *tree;



public slots:

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

    void itemselected(QTreeWidgetItem *item,int column);



public:

    void setselected(QTreeWidgetItem *item,Qt::CheckState state);



private:

    Ui::Widget *ui;

};

#endif // WIDGET_H





#include "widget.h"

#include "ui_widget.h"

#include <QDebug>



Widget::Widget(QWidget *parent)

    : QWidget(parent)

    , ui(new Ui::Widget)

{

    ui->setupUi(this);

    createtree();

}



Widget::~Widget()

{

    delete ui;

}



void Widget::createtree()

{

    tree = new QTreeWidget(this);

    tree->resize(400, 300);  // 设置控件大小为 400 x 300

    tree->move(100, 100);    // 设置控件在窗口中的位置为 (100, 100)



    tree->setColumnCount(2);                           // 设置列数为 2

    tree->setHeaderLabels({"Name", "Value"});          // 设置列标题为 "Name" 和 "Value"





    QTreeWidgetItem *root = new QTreeWidgetItem(tree);   // 创建一个根节点

    root->setText(0, "Root");                            // 设置节点文本

    root->setText(1, "0");                               // 设置节点文本

    root->setCheckState(0,Qt::Checked);

    tree->addTopLevelItem(root);                         // 将节点添加到 QTreeWidget 中







    QTreeWidgetItem *child1 = new QTreeWidgetItem(root); // 创建一个子节点

    child1->setText(0, "Child 1");                       // 设置节点文本

    child1->setText(1,"10"); // 设置节点文本''

    child1->setCheckState(0,Qt::Checked);

    root->addChild(child1); // 将节点添加到根节点下



    QTreeWidgetItem *child11 = new QTreeWidgetItem(child1); // 创建一个子节点

    child11->setText(0, "Child 11");                       // 设置节点文本

    child11->setText(1,"100"); // 设置节点文本''

    child11->setCheckState(0,Qt::Checked);

    child1->addChild(child11); // 将节点添加到根节点下



    QTreeWidgetItem *child2 = new QTreeWidgetItem(root); // 创建一个子节点

    child2->setText(0, "Child 2");                       // 设置节点文本

    child2->setText(1,"20"); // 设置节点文本

    child2->setCheckState(0,Qt::Checked);

    root->addChild(child2); // 将节点添加到根节点下



    connect(tree,SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem*)),this,SLOT(curItemChanged(QTreeWidgetItem *, QTreeWidgetItem*)));

    connect(tree,SIGNAL(itemClicked(QTreeWidgetItem *,int)),this,SLOT(itemselected(QTreeWidgetItem *,int)));

    tree->show();

}



void Widget::curItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)

{

    if(current != nullptr)

    {

         qDebug() << current->text(0);

    }

}



void Widget::itemselected(QTreeWidgetItem *item,int column)

{

    if(column == 0)

    {

        Qt::CheckState state = item->checkState(0);

        if(state == Qt::Checked || state == Qt::Unchecked)

        {

            setselected(item,state);

        }

    }

}



void Widget::setselected(QTreeWidgetItem *item,Qt::CheckState state )

{

    int ncount = item->childCount();

    for(int i = 0; i <ncount; i++)

    {

        QTreeWidgetItem *child = item->child(i);

        child->setCheckState(0,state);

        if(child->childCount() > 0)

            setselected(child,state);

    }

}

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值