树形控件的节点可以有多层、多个子节点, 如果将子节点全部展开,那么每一行都是一个数据条目。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);
}
}