QTreeWidget开放详解
- [一、创建 QTreeWidget](#一、创建 QTreeWidget)
- 二、QTreeWidget添加节点
-
- [2.1 创建 QTreeWidget 和 添加顶级节点](#2.1 创建 QTreeWidget 和 添加顶级节点)
- [2.2 QTreeWidget向顶级节点添加子节点](#2.2 QTreeWidget向顶级节点添加子节点)
- [二、 QTreeWidget处理信号和槽](#二、 QTreeWidget处理信号和槽)
-
- [2.1 处理节点点击信号](#2.1 处理节点点击信号)
- [2.1 处理节点双击信号](#2.1 处理节点双击信号)
- [2.3 处理节点展开和折叠信号](#2.3 处理节点展开和折叠信号)
- 三、QTreeWidget右键菜单
- 四、QTreeWidget拖拽操作
- [五、 QTreeWidget编辑节点](#五、 QTreeWidget编辑节点)
使用 QTreeWidget
开发时,涉及到的主要知识点包括创建树结构、添加节点、处理信号和槽、定制显示、以及处理右键菜单等。以下是一些常用的开发知识点和示例代码。
一、创建 QTreeWidget
cpp
QTreeWidget *treeWidget = new QTreeWidget(this);
treeWidget->setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
treeWidget->setHeaderLabels(headers);
二、QTreeWidget添加节点
在 QTreeWidget 中添加节点可以通过 QTreeWidgetItem 来实现。你可以向 QTreeWidget 添加顶级节点,或者向某个节点添加子节点。下面是一个详细的示例,演示了如何在 QTreeWidget 中添加节点。
2.1 创建 QTreeWidget 和 添加顶级节点
首先,我们需要创建一个 QTreeWidget 对象,并添加顶级节点:
cpp
QTreeWidget *treeWidget = new QTreeWidget(this);
treeWidget->setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
treeWidget->setHeaderLabels(headers);
// 添加顶级节点
QTreeWidgetItem *rootItem = new QTreeWidgetItem(treeWidget);
rootItem->setText(0, "Root");
rootItem->setText(1, "Root Value");
2.2 QTreeWidget向顶级节点添加子节点
你可以向 QTreeWidgetItem 添加子节点:
cpp
// 添加子节点
QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
childItem1->setText(0, "Child 1");
childItem1->setText(1, "Value 1");
QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
childItem2->setText(0, "Child 2");
childItem2->setText(1, "Value 2");
二、 QTreeWidget处理信号和槽
在 QTreeWidget
中处理信号和槽是与其他 Qt 小部件类似的。你可以连接各种信号到槽函数以响应用户的交互,例如节点点击、双击、展开和折叠等。下面是一些常见的信号和槽的使用示例:
2.1 处理节点点击信号
你可以连接 QTreeWidget::itemClicked
信号到一个槽函数,当用户点击某个节点时触发该槽函数。
cpp
#include <QtWidgets>
class MyTreeWidget : public QTreeWidget {
Q_OBJECT
public:
MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
setHeaderLabels(headers);
// 添加顶级节点
QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);
rootItem->setText(0, "Root");
rootItem->setText(1, "Root Value");
// 添加子节点
QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
childItem1->setText(0, "Child 1");
childItem1->setText(1, "Value 1");
QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
childItem2->setText(0, "Child 2");
childItem2->setText(1, "Value 2");
// 连接信号和槽
connect(this, &QTreeWidget::itemClicked, this, &MyTreeWidget::onItemClicked);
// 展开所有节点
expandAll();
}
private slots:
void onItemClicked(QTreeWidgetItem *item, int column) {
qDebug() << "Item clicked: " << item->text(column);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyTreeWidget treeWidget;
treeWidget.show();
return app.exec();
}
2.1 处理节点双击信号
你可以连接 QTreeWidget::itemDoubleClicked
信号到一个槽函数,当用户双击某个节点时触发该槽函数。
cpp
#include <QtWidgets>
class MyTreeWidget : public QTreeWidget {
Q_OBJECT
public:
MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
setHeaderLabels(headers);
// 添加顶级节点
QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);
rootItem->setText(0, "Root");
rootItem->setText(1, "Root Value");
// 添加子节点
QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
childItem1->setText(0, "Child 1");
childItem1->setText(1, "Value 1");
QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
childItem2->setText(0, "Child 2");
childItem2->setText(1, "Value 2");
// 连接信号和槽
connect(this, &QTreeWidget::itemDoubleClicked, this, &MyTreeWidget::onItemDoubleClicked);
// 展开所有节点
expandAll();
}
private slots:
void onItemDoubleClicked(QTreeWidgetItem *item, int column) {
qDebug() << "Item double-clicked: " << item->text(column);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyTreeWidget treeWidget;
treeWidget.show();
return app.exec();
}
2.3 处理节点展开和折叠信号
你可以连接 QTreeWidget::itemExpanded
和 QTreeWidget::itemCollapsed
信号到槽函数,当节点被展开或折叠时触发这些槽函数。
cpp
#include <QtWidgets>
class MyTreeWidget : public QTreeWidget {
Q_OBJECT
public:
MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
setHeaderLabels(headers);
// 添加顶级节点
QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);
rootItem->setText(0, "Root");
rootItem->setText(1, "Root Value");
// 添加子节点
QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
childItem1->setText(0, "Child 1");
childItem1->setText(1, "Value 1");
QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
childItem2->setText(0, "Child 2");
childItem2->setText(1, "Value 2");
// 连接信号和槽
connect(this, &QTreeWidget::itemExpanded, this, &MyTreeWidget::onItemExpanded);
connect(this, &QTreeWidget::itemCollapsed, this, &MyTreeWidget::onItemCollapsed);
// 展开所有节点
expandAll();
}
private slots:
void onItemExpanded(QTreeWidgetItem *item) {
qDebug() << "Item expanded: " << item->text(0);
}
void onItemCollapsed(QTreeWidgetItem *item) {
qDebug() << "Item collapsed: " << item->text(0);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyTreeWidget treeWidget;
treeWidget.show();
return app.exec();
}
三、QTreeWidget右键菜单
同样地,可以在 QTreeWidget
上实现右键菜单操作。以下是一个示例:
cpp
class MyTreeWidget : public QTreeWidget {
public:
MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, &QTreeWidget::customContextMenuRequested, this, &MyTreeWidget::showContextMenu);
}
private:
void showContextMenu(const QPoint &pos) {
QTreeWidgetItem *item = itemAt(pos);
if (!item) return;
QMenu contextMenu(tr("Context menu"), this);
QAction *action1 = new QAction("Action 1", this);
connect(action1, &QAction::triggered, this, [this, item]() { action1Clicked(item); });
contextMenu.addAction(action1);
QAction *action2 = new QAction("Action 2", this);
connect(action2, &QAction::triggered, this, [this, item]() { action2Clicked(item); });
contextMenu.addAction(action2);
contextMenu.exec(mapToGlobal(pos));
}
void action1Clicked(QTreeWidgetItem *item) {
qDebug() << "Action 1 clicked on item: " << item->text(0);
}
void action2Clicked(QTreeWidgetItem *item) {
qDebug() << "Action 2 clicked on item: " << item->text(0);
}
};
四、QTreeWidget拖拽操作
启用拖拽操作:
cpp
treeWidget->setDragEnabled(true);
treeWidget->setAcceptDrops(true);
treeWidget->setDropIndicatorShown(true);
treeWidget->setDragDropMode(QAbstractItemView::InternalMove);
五、 QTreeWidget编辑节点
设置节点为可编辑:
cpp
QTreeWidgetItem *editableItem = new QTreeWidgetItem(treeWidget);
editableItem->setFlags(editableItem->flags() | Qt::ItemIsEditable);
treeWidget->editItem(editableItem, 0);
其他QT文章
1. QT开发环境安装以配置。
2. QT线段画板实战
3. 半小时玩转QT桌面系统托盘(含托盘消息)
4. QT入门开发一个时钟
5. 半小时教你做大转盘游戏(QT篇)
6. 手把手教你制作【带吸附效果的线段绘制】(QT)
7. 手把手教你开发-滚动效果号码抽奖(QT)
8. 100行代码实现贪吃蛇小游戏
9.C++实现《扫雷》游戏(入门经典)
10. svg转图片工具开发
11. Qt网路与通信(获取本机网络信息)
12. Qt网路与通信(UDP客户与服务)
13. Qt网络与通信(TCP聊天室)
14. Qt多线程以及线程池
15. Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例
16. 取色器(QT)
17. MQTT客户端入门开发
18.QT文件上传带进度条实例(含源码)
19. Qt音乐播放器开发实例(可毕设含源码)
20. Qt学生管理系统-- 数据库课程设计(付源码)