当前位置:   article > 正文

QTreeWidget开放详解_qtreewidget设置展开

qtreewidget设置展开

使用 QTreeWidget 开发时,涉及到的主要知识点包括创建树结构、添加节点、处理信号和槽、定制显示、以及处理右键菜单等。以下是一些常用的开发知识点和示例代码。

一、创建 QTreeWidget

QTreeWidget *treeWidget = new QTreeWidget(this);
treeWidget->setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
treeWidget->setHeaderLabels(headers);
  • 1
  • 2
  • 3
  • 4
  • 5

二、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");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二、 QTreeWidget处理信号和槽

QTreeWidget 中处理信号和槽是与其他 Qt 小部件类似的。你可以连接各种信号到槽函数以响应用户的交互,例如节点点击、双击、展开和折叠等。下面是一些常见的信号和槽的使用示例:

2.1 处理节点点击信号

你可以连接 QTreeWidget::itemClicked 信号到一个槽函数,当用户点击某个节点时触发该槽函数。

#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();
}
  • 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

2.1 处理节点双击信号

你可以连接 QTreeWidget::itemDoubleClicked 信号到一个槽函数,当用户双击某个节点时触发该槽函数。

#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();
}
  • 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

2.3 处理节点展开和折叠信号

你可以连接 QTreeWidget::itemExpandedQTreeWidget::itemCollapsed 信号到槽函数,当节点被展开或折叠时触发这些槽函数。

#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();
}
  • 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

三、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);
    }
};
  • 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

四、QTreeWidget拖拽操作

启用拖拽操作:

treeWidget->setDragEnabled(true);
treeWidget->setAcceptDrops(true);
treeWidget->setDropIndicatorShown(true);
treeWidget->setDragDropMode(QAbstractItemView::InternalMove);
  • 1
  • 2
  • 3
  • 4

五、 QTreeWidget编辑节点

设置节点为可编辑:

QTreeWidgetItem *editableItem = new QTreeWidgetItem(treeWidget);
editableItem->setFlags(editableItem->flags() | Qt::ItemIsEditable);
treeWidget->editItem(editableItem, 0);


  • 1
  • 2
  • 3
  • 4
  • 5

其他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学生管理系统-- 数据库课程设计(付源码)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/890395
推荐阅读
相关标签
  

闽ICP备14008679号