QTreeView介绍

QTreeView是Qt框架中的一个控件类,用于显示和管理树形结构的数据。它基于Model/View架构,通过与相应的数据模型进行交互,提供了丰富的功能和灵活性。以下是QTreeView的详细介绍:

  1. 数据模型:QTreeView依赖于一个数据模型来提供数据。数据模型可以是QAbstractItemModel的子类,例如QStandardItemModel或自定义的数据模型。通过设置数据模型,QTreeView可以获得树形结构的数据,并将其显示在界面上。

  2. 树形结构:QTreeView以树状结构的形式展示数据。每个节点代表一个项,可以包含子节点,形成树的分支。用户可以展开和折叠节点,以在视图中查看不同级别的数据。

  3. 列标题:QTreeView支持多列显示,每一列可以有一个标题(表头)。开发者可以使用setHeaderLabels()方法设置列标题,使数据按列进行组织和展示。

  4. 根节点:树形结构的顶层节点称为根节点。QTreeView可以显示一个或多个根节点。使用setRootIndex()方法可以设置根节点的索引,如果不设置,则默认将所有项都作为根节点来显示。

  5. 展开和折叠:用户可以通过点击加号或减号图标来展开和折叠节点。展开节点会显示它的子节点,折叠节点则隐藏它的子节点。QTreeView提供了相关方法(如expand()和collapse())来编程控制节点的展开和折叠。

  6. 选择和编辑:用户可以使用鼠标或键盘在QTreeView中选择和编辑项。QTreeView支持单选和多选模式,并提供相关信号和方法来获取和操作选择的项。用户还可以通过编辑模式对项进行编辑,例如修改文本或更改数据。

  7. 滚动和定位:当视图中的项数量超过可见区域时,QTreeView会自动提供滚动条。开发者可以使用scrollTo()方法将特定的项滚动到可见区域,以便用户查看或操作。

  8. 信号和槽:QTreeView提供了一系列信号来响应用户的交互操作,例如项的点击、选择变化等。通过连接这些信号和自定义的槽函数,开发者可以实现针对不同交互事件的响应逻辑。

  9. 样式和外观:QTreeView的外观可以通过样式表进行定制,使其与应用程序的整体风格保持一致。可以改变项的颜色、字体、背景等,以及自定义图标和样式。

总之,QTreeView是一个功能强大、高度可定制的树形结构显示控件。它通过数据模型提供数据,展示多层级的树形结构,并支持选择、展开折叠、编辑等交互操作,为开发者提供了灵活性和便捷性。通过QTreeView,开发者可以快速构建出直观、易用的树状数据展示界面。

QTreeView接口

以下是QTreeView的常用接口:

  1. 构造函数:QTreeView(QWidget *parent = nullptr)。创建一个空的树形视图。

  2. setModel(QAbstractItemModel *model):设置树形视图的数据模型,即QAbstractItemModel的子类对象,用于提供数据。

  3. model() const:返回与树形视图关联的数据模型。

  4. setRootIndex(const QModelIndex &index):设置根节点的索引。

  5. rootIndex() const:返回根节点的索引。

  6. setHeaderLabels(const QStringList &labels):设置树形视图的列标题(表头)。

  7. headerLabels() const:返回树形视图的列标题。

  8. setColumnWidth(int column, int width):设置指定列的宽度。

  9. expand(const QModelIndex &index):展开指定索引的项及其子项。

  10. collapse(const QModelIndex &index):折叠指定索引的项及其子项。

  11. expandAll():展开所有项。

  12. collapseAll():折叠所有项。

  13. currentIndex() const:返回当前选择的项的索引。

  14. selectionModel() const:返回与树形视图关联的选择模型。

  15. scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible):将项滚动到可见区域。

  16. edit(const QModelIndex &index):编辑指定索引的项。

  17. show():显示树形视图。

  18. hide():隐藏树形视图。

  19. setFixedSize(int width, int height):设置固定的宽度和高度。

  20. clicked(const QModelIndex &index):点击指定索引的项时触发的信号。

这些接口提供了QTreeView的基本功能,包括设置数据模型、展开和折叠项、选择项、滚动、编辑等操作,使得开发者可以方便地创建和管理树形结构的数据。

QStandardItemModel介绍及接口

Qt表格数据处理_zw_ggr_2017的博客-CSDN博客

QStandardItem介绍及接口

Qt表格数据处理_zw_ggr_2017的博客-CSDN博客

代码演示

#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建主窗口和树形控件
    QTreeView treeView;
    treeView.setWindowTitle("分类目录演示");

    // 创建标准模型
    QStandardItemModel model;
    model.setHorizontalHeaderLabels(QStringList() << "分类" << "具体项目");

    // 创建根节点
    QStandardItem* rootItem = new QStandardItem("电子产品");

    // 创建子节点和具体项目
    QStandardItem* phoneItem = new QStandardItem("手机");

    QStandardItem* appleItem = new QStandardItem("苹果");
    appleItem->setData("Apple Inc.", Qt::UserRole);  // 设置自定义数据

    QStandardItem* iphone12Item = new QStandardItem("iPhone 12");
    iphone12Item->setData("2020年发布的新款iPhone", Qt::UserRole);

    QStandardItem* iphone11Item = new QStandardItem("iPhone 11");
    iphone11Item->setData("2019年发布的iPhone", Qt::UserRole);

    QStandardItem* xiaomiItem = new QStandardItem("小米");
    xiaomiItem->setData("小米科技有限责任公司", Qt::UserRole);

    QStandardItem* mi11Item = new QStandardItem("小米11");
    mi11Item->setData("小米的旗舰手机", Qt::UserRole);

    QStandardItem* redmiNote9Item = new QStandardItem("红米Note 9");
    redmiNote9Item->setData("小米旗下的低价手机", Qt::UserRole);

    QStandardItem* computerItem = new QStandardItem("电脑");

    QStandardItem* lenovoItem = new QStandardItem("联想");
    lenovoItem->setData("Lenovo Inc.", Qt::UserRole);

    QStandardItem* xiaoxinItem = new QStandardItem("联想小新");
    xiaoxinItem->setData("联想旗下的性价比电脑", Qt::UserRole);

    QStandardItem* zhengjiuzheItem = new QStandardItem("联想拯救者");
    zhengjiuzheItem->setData("联想旗下的游戏电脑", Qt::UserRole);

    QStandardItem* huaweiItem = new QStandardItem("华为");
    huaweiItem->setData("HUAWEI Inc.", Qt::UserRole);

    QStandardItem* bookDItem = new QStandardItem("华为 matebook16d");
    bookDItem->setData("华为旗下的中端电脑", Qt::UserRole);

    QStandardItem* bookSItem = new QStandardItem("华为 matebook16s");
    bookSItem->setData("华为旗下旗舰电脑", Qt::UserRole);

    // 将子节点添加到根节点
    rootItem->appendRow(phoneItem);
    phoneItem->appendRow(appleItem);
    appleItem->appendRow(iphone12Item);
    appleItem->appendRow(iphone11Item);
    phoneItem->appendRow(xiaomiItem);
    xiaomiItem->appendRow(mi11Item);
    xiaomiItem->appendRow(redmiNote9Item);
    rootItem->appendRow(computerItem);
    computerItem->appendRow(lenovoItem);
    lenovoItem->appendRow(xiaoxinItem);
    lenovoItem->appendRow(zhengjiuzheItem);
    computerItem->appendRow(huaweiItem);
    huaweiItem->appendRow(bookDItem);
    huaweiItem->appendRow(bookSItem);

    // 将根节点设置给模型
    model.appendRow(rootItem);

    // 设置模型给树形控件
    treeView.setModel(&model);

    // 点击项时输出相关文本和数据
    QObject::connect(&treeView, &QTreeView::clicked, [&](const QModelIndex& index) {
        QString itemText = model.itemData(index)[Qt::DisplayRole].toString();
        QVariant itemData = model.itemData(index)[Qt::UserRole];
        qDebug() << "具体项目:" << itemText;
        qDebug() << "数据:" << itemData;
    });

    treeView.expandAll();

    // 显示主窗口
    treeView.show();

    treeView.setFixedSize(600, 600);

    return a.exec();
}

运行界面:

 依次点击各个项:

具体项目: "iPhone 12"

数据: QVariant(QString, "2020年发布的新款iPhone")

具体项目: "iPhone 11"

数据: QVariant(QString, "2019年发布的iPhone")

具体项目: "小米11"

数据: QVariant(QString, "小米的旗舰手机")

具体项目: "红米Note 9"

数据: QVariant(QString, "小米旗下的低价手机")

具体项目: "联想小新"

数据: QVariant(QString, "联想旗下的性价比电脑")

具体项目: "联想拯救者"

数据: QVariant(QString, "联想旗下的游戏电脑")

具体项目: "华为 matebook16d"

数据: QVariant(QString, "华为旗下的中端电脑")

具体项目: "华为 matebook16s"

数据: QVariant(QString, "华为旗下旗舰电脑")

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐