QTreeWidget开放详解
- 一、创建 QTreeWidget
- 二、QTreeWidget添加节点
- 2.1 创建 QTreeWidget 和 添加顶级节点
- 2.2 QTreeWidget向顶级节点添加子节点
- 二、 QTreeWidget处理信号和槽
- 2.1 处理节点点击信号
- 2.1 处理节点双击信号
- 2.3 处理节点展开和折叠信号
- 三、QTreeWidget右键菜单
- 四、QTreeWidget拖拽操作
- 五、 QTreeWidget编辑节点
使用 QTreeWidget
开发时,涉及到的主要知识点包括创建树结构、添加节点、处理信号和槽、定制显示、以及处理右键菜单等。以下是一些常用的开发知识点和示例代码。
一、创建 QTreeWidget
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 对象,并添加顶级节点:
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 添加子节点:
// 添加子节点
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
信号到一个槽函数,当用户点击某个节点时触发该槽函数。
#include <QtWidgets>class MyTreeWidget : public QTreeWidget {Q_OBJECTpublic: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
信号到一个槽函数,当用户双击某个节点时触发该槽函数。
#include <QtWidgets>class MyTreeWidget : public QTreeWidget {Q_OBJECTpublic: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
信号到槽函数,当节点被展开或折叠时触发这些槽函数。
#include <QtWidgets>class MyTreeWidget : public QTreeWidget {Q_OBJECTpublic: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
上实现右键菜单操作。以下是一个示例:
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拖拽操作
启用拖拽操作:
treeWidget->setDragEnabled(true);
treeWidget->setAcceptDrops(true);
treeWidget->setDropIndicatorShown(true);
treeWidget->setDragDropMode(QAbstractItemView::InternalMove);
五、 QTreeWidget编辑节点
设置节点为可编辑:
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学生管理系统-- 数据库课程设计(付源码)