QT树的具体项目实现

 更新时间:2023年06月28日 11:15:32   作者:程序员如山石  
本文主要介绍了QT树的具体项目实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

理论

在Model/View结构中,数据模型为视图组件和代理组件提供存取数据的标准接口。在QT中,所有的数据模型类都从QAbstactItemModel继承而来,不管底层的数据结构是如何组织数据的,QAbstractItemModel的子类都以表格的层次结构表示数据,视图组件通过这种规则来存取模型中的数据,但是表现给用户的形式不一样。图5-4是数据模型的3种常见表现形式。不管数据模型的表现形式是怎么样的,数据模型中的存在数据的基本单元都是项(item), 每一个项有一个行号、一个列号,还有一个父项(parent item)。在列表和表格模式下,所有的项都有一个相同的顶层项(root item); 在树状结构中,行号、列号、父项稍微复杂一点,但是由这3个参数完全可以定义一个项的位置,从而存取项的数据。

下图就是QT官方提供的数据模型的几种表现形式:

实践情况

先定义一个treeModel,这也是最关键的地方:头文件:

#ifndef TREEMODEL_H
#define TREEMODEL_H
#include <QList>
#include <QStandardItemModel>
#include <QObject>
class TreeModel
{
public:
    TreeModel(QObject *parent = nullptr);
    ~TreeModel();
    void initModel();
    QStandardItemModel* getStandardItemModel();
private:
    QStandardItemModel* m_standardItemModel;
};
#endif // TREEMODEL_H

cpp文件:

#pragma execution_character_set("utf-8")
#include "treemodel.h"
TreeModel::TreeModel(QObject *parent):m_standardItemModel(nullptr)
{
    m_standardItemModel = new QStandardItemModel(parent);
}
TreeModel::~TreeModel()
{
    if(nullptr == m_standardItemModel)
    {
        delete m_standardItemModel;
    }
}
void TreeModel::initModel()
{
    m_standardItemModel = new QStandardItemModel();
    // 2.使用model设置QTreeView表头
    QStringList strHeads = QStringList(QString::fromUtf8("姓名"));
    strHeads.append(QString::fromUtf8("性别"));
    strHeads.append(QString::fromUtf8("年龄"));
    m_standardItemModel->setHorizontalHeaderLabels(strHeads);
    QStandardItem *item1 = new QStandardItem(QString::fromUtf8("四年级"));
    m_standardItemModel->setItem(0,0,item1);
    QStandardItem *item00 = new QStandardItem(QString::fromUtf8("张三"));
    QStandardItem *item10 = new QStandardItem(QString::fromUtf8("张四"));
    QStandardItem *item20 = new QStandardItem(QString::fromUtf8("张五"));
    QStandardItem *item01 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item11 = new QStandardItem(QString::fromUtf8("女"));
    QStandardItem *item21 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item02 = new QStandardItem(QString::fromUtf8("15"));
    QStandardItem *item12 = new QStandardItem(QString::fromUtf8("14"));
    QStandardItem *item22 = new QStandardItem(QString::fromUtf8("16"));
    m_standardItemModel->item(0,0)->setChild(0,0,item00);
    m_standardItemModel->item(0,0)->setChild(1,0,item10);
    m_standardItemModel->item(0,0)->setChild(2,0,item20);
    m_standardItemModel->item(0,0)->setChild(0,1,item01);
    m_standardItemModel->item(0,0)->setChild(1,1,item11);
    m_standardItemModel->item(0,0)->setChild(2,1,item21);
    m_standardItemModel->item(0,0)->setChild(0,2,item02);
    m_standardItemModel->item(0,0)->setChild(1,2,item12);
    m_standardItemModel->item(0,0)->setChild(2,2,item22);
    QStandardItem *item2 = new QStandardItem(QString::fromUtf8("五年级"));
    m_standardItemModel->setItem(1,0,item2);
    QStandardItem *item200 = new QStandardItem(QString::fromUtf8("李三"));
    QStandardItem *item210 = new QStandardItem(QString::fromUtf8("李四"));
    QStandardItem *item220 = new QStandardItem(QString::fromUtf8("李五"));
    QStandardItem *item201 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item211 = new QStandardItem(QString::fromUtf8("女"));
    QStandardItem *item221 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item202 = new QStandardItem(QString::fromUtf8("15"));
    QStandardItem *item212 = new QStandardItem(QString::fromUtf8("14"));
    QStandardItem *item222 = new QStandardItem(QString::fromUtf8("16"));
    m_standardItemModel ->item(1,0)->setChild(0,0,item200);
    m_standardItemModel->item(1,0)->setChild(1,0,item210);
    m_standardItemModel->item(1,0)->setChild(2,0,item220);
    m_standardItemModel->item(1,0)->setChild(0,1,item201);
    m_standardItemModel->item(1,0)->setChild(1,1,item211);
    m_standardItemModel->item(1,0)->setChild(2,1,item221);
    m_standardItemModel->item(1,0)->setChild(0,2,item202);
    m_standardItemModel->item(1,0)->setChild(1,2,item212);
    m_standardItemModel->item(1,0)->setChild(2,2,item222);
}
QStandardItemModel *TreeModel::getStandardItemModel()
{
    return this->m_standardItemModel;
}

界面类:

#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <unistd.h>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    treeModel = new TreeModel(this);
    treeModel->initModel();
    // 槽函数
    connect(ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MainWindow::_on_treeView_current_changed);
    connect(ui->treeView, &QTreeView::customContextMenuRequested, this, &MainWindow::_on_treeView_MenuPopup);
    ui->treeView->setModel(treeModel->getStandardItemModel());
    ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    // 右键菜单
    ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
    ui->treeView->expandAll();
}
MainWindow::~MainWindow()
{
    delete ui;
}

实现效果:

总结

其实这里就是这样一个类似的数据结构:

struct item{
int row;
int rank;
item parent;
QString data;
vector<item> childrenList;
    }

记准官方这张图,就明白怎么用了,其实,很简单:

到此这篇关于QT树的具体项目实现的文章就介绍到这了,更多相关QT树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++之list容器模拟实现方式

    C++之list容器模拟实现方式

    这篇文章主要介绍了C++之list容器模拟实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 如何优雅地使用c语言编写爬虫

    如何优雅地使用c语言编写爬虫

    如何优雅地使用c语言编写爬虫,本文介绍cspider爬虫库,这个cspider爬虫库的使命在于,我们能够使用c语言,依然能够优雅地编写爬虫程序,需要的朋友可以参考下
    2015-12-12
  • C++实现std::set的示例项目

    C++实现std::set的示例项目

    std::set是C++标准库中的关联容器,提供有序唯一元素集合,本文就来介绍一下std::set的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Matlab实现简单扩频语音水印算法详解

    Matlab实现简单扩频语音水印算法详解

    本文主要介绍了通过MATLAB设计并实现一种基于音频的扩频水印算法,从而了解参数对扩频水印算法性能的影响。代码具有一定的价值,感兴趣的小伙伴可以关注一下
    2021-11-11
  • 详解C++11 原始字符串字面量(Json字符串表达更方便)

    详解C++11 原始字符串字面量(Json字符串表达更方便)

    原始字符串字面量(Raw String Literal)是C++11引入的一种字符串表示方式,用于简化字符串的定义,特别是当字符串中包含大量特殊字符(如换行符、双引号等)时,这篇文章给大家介绍C++11原始字符串字面量(Json字符串表达更方便)的相关知识,感兴趣的朋友一起看看吧
    2025-03-03
  • C++中关键字 override 的简析

    C++中关键字 override 的简析

    这篇小文来聊聊 C++中的关键字 override,它的含义其实两句话就说完了,但为了叙述的完整性,让我们从虚函数说起。感兴趣的小伙伴可以跟着小编一起学习下面文章内容
    2021-09-09
  • C语言中初始、增加和删除进程信号的操作方法简介

    C语言中初始、增加和删除进程信号的操作方法简介

    这篇文章主要介绍了C语言中初始、增加和删除进程信号的操作方法简介,分别是sigemptyset函数、sigaddset函数和sigdelset函数的用法,需要的朋友可以参考下
    2015-09-09
  • 详解 linux c++的编译器g++的基本使用

    详解 linux c++的编译器g++的基本使用

    这篇文章主要介绍了详解 linux c++的编译器g++的基本使用的相关资料,需要的朋友可以参考下
    2017-01-01
  • C语言不定长数组及初始化方法

    C语言不定长数组及初始化方法

    今天小编就为大家分享一篇C语言不定长数组及初始化方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 解析设计模式中的Prototype原型模式及在C++中的使用

    解析设计模式中的Prototype原型模式及在C++中的使用

    这篇文章主要介绍了设计模式中的Prototype原型模式及在C++中的使用,需要的朋友可以参考下
    2016-03-03

最新评论