QTreeVirew 与 QTreeWidget 简单使用

Qt QTreeVirew 与 QTreeWidget 简单使用

QTreeWidget 是 QTreeView 的子类

Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有mvc的特点)。

image

初始化

  • 新建 Widgets 项目
  • mainwindow.ui 文件的设计模式下拖入 Tree ViewTree Widget
  • 编辑 mainwindow.cpp,内容

mainwindow 源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <QStandardItem>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);


// MARK: tree view
QStandardItemModel *goodsModel = new QStandardItemModel(0, 4,this);
ui->treeView->setColumnWidth(0,50);
ui->treeView->setColumnWidth(1,200);
ui->treeView->setColumnWidth(2,200);
ui->treeView->setColumnWidth(3,200);
goodsModel->setHeaderData(0, Qt::Horizontal, tr("No"));
goodsModel->setHeaderData(1, Qt::Horizontal, tr("name"));
goodsModel->setHeaderData(2, Qt::Horizontal, tr("value1"));
goodsModel->setHeaderData(3, Qt::Horizontal, tr("value2"));
ui->treeView->setModel(goodsModel);
// 设置数据
for (int j = 0; j < 4; ++j)
{
QList<QStandardItem *> items;
for (int i = 0; i < 3; ++i)
{
QStandardItem *item = new QStandardItem(QString("item %1 %2").arg(j).arg(i));
if (0 == i)
item->setCheckable(true);
items.push_back(item);
}
goodsModel->appendRow(items);
for (int i = 0; i < 4; ++i)
{
QList<QStandardItem *> childItems;
for (int i = 0; i < 3; ++i)
{
QStandardItem *item = new QStandardItem(QString("child %0 %1").arg(j).arg(i));
if (0 == i)
item->setCheckable(true);
childItems.push_back(item);
}
items.at(0)->appendRow(childItems);
}
}
//设置treeview 能够被多选
ui->treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);


// MARK: tree widget
ui->treeWidget->setColumnCount(2);
ui->treeWidget->setHeaderLabels(QStringList()<<"first"<<"second");

QTreeWidgetItem *rootItem_1 = new QTreeWidgetItem(ui->treeWidget);
QTreeWidgetItem *childItem_1_1 = new QTreeWidgetItem();
QTreeWidgetItem *childItem_1_2 = new QTreeWidgetItem();
QTreeWidgetItem *childItem_1_2_1 = new QTreeWidgetItem();

QTreeWidgetItem *rootItem_2 = new QTreeWidgetItem(ui->treeWidget);
QTreeWidgetItem *childItem_2_1 = new QTreeWidgetItem();
QTreeWidgetItem *childItem_2_2 = new QTreeWidgetItem();
QTreeWidgetItem *childItem_2_3 = new QTreeWidgetItem();

rootItem_1->setText(0,QObject::tr("常用文件夹"));
childItem_1_1->setText(0,QObject::tr("所有未读"));
childItem_1_2->setText(0,QObject::tr("置顶邮件"));
childItem_1_2_1->setText(0,QObject::tr("测试"));
childItem_1_2_1->setForeground(0,QBrush(QColor(Qt::blue)));

rootItem_2->setText(0,QObject::tr("我的邮箱"));
childItem_2_1->setText(0,QObject::tr("收件箱"));
childItem_2_1->setText(1,QObject::tr("1封"));
childItem_2_2->setText(0,QObject::tr("草稿箱"));
childItem_2_2->setText(1,QObject::tr("2封"));
childItem_2_3->setText(0,QObject::tr("发件箱"));
childItem_2_3->setText(1,QObject::tr("3封"));

ui->treeWidget->addTopLevelItem(rootItem_1);
rootItem_1->addChild(childItem_1_1);
rootItem_1->addChild(childItem_1_2);
childItem_1_2->addChild(childItem_1_2_1);
ui->treeWidget->addTopLevelItem(rootItem_2);
rootItem_2->addChild(childItem_2_1);
rootItem_2->addChild(childItem_2_2);
rootItem_2->addChild(childItem_2_3);

ui->treeWidget->expandAll(); //结点全部展开
}

MainWindow::~MainWindow()
{
delete ui;
}

// 在ui设计中,选中 tree view 右键 转到槽 clicked ok
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
QString str;
str += QStringLiteral("treeview \t row:%1,column:%2\n").arg(index.row()).arg(index.column());
str += QStringLiteral("当前选中:%1 \t 父级:%2").arg(index.data().toString()).arg(index.parent().data().toString());
ui->label->setText(str);
}

本文标题:QTreeVirew 与 QTreeWidget 简单使用

文章作者:史彦超

发布时间:2016年10月11日 - 22:10

最后更新:2021年07月20日 - 16:07

原始链接:https://doingself.github.io/2016/10/11/2016-10-11-QTreeVirew%E4%B8%8EQTreeWidget%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Donate comment here