添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 TreeWidget 树形选择组件的常用方法及灵活运用。

QTreeWidget 是 Qt 中的树形控件组件,用于显示树形结构的数据。它继承自 QTreeView QTreeWidget ,提供了一个方便的方式来展示和编辑包含层次结构数据的项目。

以下是 QTreeWidget 类的一些常用方法,说明和概述:

addTopLevelItem(QTreeWidgetItem *item) 向树中添加一个顶级项目。 addTopLevelItems(const QList<QTreeWidgetItem *> &items) 向树中添加多个顶级项目。 clear() 清除树中的所有项目。 currentItem() 返回当前选择的项目。 currentIndex() 返回当前选择的项目的模型索引。 editItem(QTreeWidgetItem *item, int column) 进入编辑模式以编辑给定项目的指定列。 headerItem() 返回树的标题项目,该项目可用于设置标题标签。 invisibleRootItem() 返回树的不可见根项目。 itemAbove(QTreeWidgetItem *item) 返回给定项目的上面一个项目。 itemBelow(QTreeWidgetItem *item) 返回给定项目的下面一个项目。 setCurrentItem(QTreeWidgetItem *item) 设置当前选择的项目。 topLevelItem(int index) 返回树中给定索引的顶级项目。 topLevelItemCount() 返回树的顶级项目的数量。 insertTopLevelItem(int index, QTreeWidgetItem *item) 在给定索引处插入一个顶级项目。 insertTopLevelItems(int index, const QList<QTreeWidgetItem *> &items) 在给定索引处插入多个顶级项目。 takeTopLevelItem(int index) 从树中移除给定索引处的顶级项目,并返回该项目的指针。 scrollToItem(QTreeWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible) 滚动树以确保给定项目可见。 sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder) 对树中的项目进行排序。 findItems(const QString &text, Qt::MatchFlags flags, int column = 0) 查找树中包含指定文本的项目。

这只是 QTreeWidget 类的一小部分方法。你可以查阅 官方文档 以获取完整的方法列表,以及这些方法的详细说明。

首先我们来绘制一下 UI 界面,由于该节点同时具备编辑功能所以实现起来要稍微复杂一些,我们分别在最左侧放置一个 TreeWidget 组件,在中间放置不同的 PushButton 组件,最后是一个 plainTextEdit 组件用来接收反馈,如下图所示;

1.1 初始化组件

如下代码是在 Qt 中使用 QTreeWidget 初始化一个树形结构,其中包含了朋友、同学和陌生人等不同分类的节点。

以下是概述:

  • 初始化 QTreeWidget 设置 QTreeWidget 的一些基本属性,包括列数、标题的隐藏等。
  • 创建父节点 “朋友”: 使用 QTreeWidgetItem 创建一个朋友节点,并设置图标、选择状态等属性。然后添加两个子节点 “老张” 和 “老王”,分别设置图标和选择状态。
  • 创建父节点 “同学”: 类似地,创建一个同学节点,并添加两个子节点 “张三” 和 “李四”,设置相应的图标和选择状态。
  • 创建 “陌生人” 节点: 使用 QTreeWidgetItem 直接创建一个陌生人节点,并设置文本和图标。
  • 将节点添加到 QTreeWidget 中: 使用 addTopLevelItem 将 “同学” 和 “陌生人” 节点添加到 QTreeWidget 的顶级。
  • 展开所有节点: 使用 expandAll 展开所有节点,使其在初始化时可见。
  • 设置 QTreeWidget 的大小: 使用 resize 设置 QTreeWidget 的大小。
  • 这段代码的主要功能是创建一个包含不同分类和子节点的树形结构,每个节点可以有不同的图标、文本和选择状态。在展示的树形结构中,朋友和同学节点有子节点,而陌生人节点没有子节点。这个示例展示了 QTreeWidget 用于创建层次结构的基本用法。

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

    // ----------------------------------------------
    // 初始化TreeWidget组件
    // ----------------------------------------------

    // 设置QTreeWidget的列数
    ui->treeWidget->setColumnCount(1);

    // 设置QTreeWidget标题隐藏
    ui->treeWidget->setHeaderHidden(true);

    // ----------------------------------------------
    // 创建QTreeWidget的朋友节点 此时的父节点是TreeWidget
    // ----------------------------------------------

    QTreeWidgetItem *Friend = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("朋友")));
    Friend->setIcon(0,QIcon(":/image/4.ico"));
    Friend->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable
    | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
    Friend->setCheckState(0,Qt::Checked);

    // 给Friend添加一个子节点frd
    QTreeWidgetItem *frd = new QTreeWidgetItem(Friend);
    frd->setText(0,"老张");
    frd->setIcon(0,QIcon(tr(":/image/1.ico")));
    frd->setCheckState(0,Qt::Checked);

    // 继续给Friend添加一个子节点frs
    QTreeWidgetItem *frs = new QTreeWidgetItem(Friend);
    frs->setText(0,"老王");
    frs->setIcon(0,QIcon(tr(":/image/1.ico")));
    frs->setCheckState(0,Qt::Unchecked);

    // ----------------------------------------------
    // 继续创建名叫同学节点 父节点同样是TreeWidget
    // ----------------------------------------------
    QTreeWidgetItem * ClassMate = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("同学")));
    ClassMate->setIcon(0,QIcon(":/image/5.ico"));
    ClassMate->setCheckState(0,Qt::Checked);

    // Fly是ClassMate的子节点
    QTreeWidgetItem *Fly = new QTreeWidgetItem(QStringList(QString("张三")));
    Fly->setIcon(0,QIcon(tr(":/image/2.ico")));

    // 创建子节点的另一种方法
    ClassMate->addChild(Fly);
    Fly->setCheckState(0,Qt::Checked);

    // 继续创建子节点Fls
    QTreeWidgetItem *Fls = new QTreeWidgetItem(QStringList(QString("李四")));
    Fls->setIcon(0,QIcon(tr(":/image/2.ico")));
    ClassMate->addChild(Fls);
    Fls->setCheckState(0,Qt::Checked); // 设置为选中

    // ----------------------------------------------
    // 创建陌生人节点
    // ----------------------------------------------
    QTreeWidgetItem *Strange = new QTreeWidgetItem(true);
    Strange->setText(0,"陌生人");
    Strange->setIcon(0,QIcon(":/image/6.ico"));

    ui->treeWidget->addTopLevelItem(ClassMate);
    ui->treeWidget->addTopLevelItem(Strange);

    // 展开QTreeWidget的所有节点
    ui->treeWidget->expandAll();
    ui->treeWidget->resize(271,401);
    }

    代码运行后可动态对左侧组件进行初始化,并增加应有的父节点与子节点,如下图;

    1.2 添加根节点

    如下槽函数,其核心功能是在 QTreeWidget 中添加一个新的顶级父节点,并在 QPlainTextEdit 中添加一行文本记录。

    以下是概述:

  • 获取节点文本: 使用 QString NodeText = "新的父节点"; 设置新父节点的文本。
  • 创建新的 QTreeWidgetItem 使用 QTreeWidgetItem 的构造函数创建一个新的顶级父节点,并设置其文本和图标。
  • 添加节点到 QTreeWidget 中: 使用 ui->treeWidget->addTopLevelItem(item); 将新的顶级父节点添加到 QTreeWidget 中。
  • 记录操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("添加新的父节点"); 将一行文本记录添加到 QPlainTextEdit 中,用于记录操作。
  • 这段代码的作用是在点击按钮时,在 QTreeWidget 中添加一个新的顶级父节点,并在 QPlainTextEdit 中记录这一操作。这样可以用于在界面上动态添加树节点,并记录相关的操作信息。

    void MainWindow::on_pushButton_add_clicked()
    {
    QString NodeText = "新的父节点";
    QTreeWidgetItem *item = new QTreeWidgetItem(true);
    item->setText(0,NodeText);
    item->setIcon(0,QIcon(":/image/7.ico"));
    ui->treeWidget->addTopLevelItem(item);
    ui->plainTextEdit->appendPlainText("添加新的父节点");
    }

    运行后通过点击添加根节点按钮,每次则可以生成一个根,如下图;

    1.3 添加子节点

    如下槽函数,其核心功能是在 QTreeWidget 中添加新的子节点,并在 QPlainTextEdit 中添加一行文本记录。

    以下是概述:

  • 获取当前选择的节点: 使用 QTreeWidgetItem * item= ui->treeWidget->currentItem(); 获取当前在 QTreeWidget 中选择的节点。
  • 判断是否有选择的节点: 使用 if(item!=NULL) 条件判断,如果存在选择的节点,则调用 AddTreeNode 函数添加子节点;否则,调用 AddTreeRoot 函数添加新的根节点。
  • 添加子节点或新的根节点:
  •