QT樹的具體項(xiàng)目實(shí)現(xiàn)
理論
在Model/View結(jié)構(gòu)中,數(shù)據(jù)模型為視圖組件和代理組件提供存取數(shù)據(jù)的標(biāo)準(zhǔn)接口。在QT中,所有的數(shù)據(jù)模型類都從QAbstactItemModel繼承而來,不管底層的數(shù)據(jù)結(jié)構(gòu)是如何組織數(shù)據(jù)的,QAbstractItemModel的子類都以表格的層次結(jié)構(gòu)表示數(shù)據(jù),視圖組件通過這種規(guī)則來存取模型中的數(shù)據(jù),但是表現(xiàn)給用戶的形式不一樣。圖5-4是數(shù)據(jù)模型的3種常見表現(xiàn)形式。不管數(shù)據(jù)模型的表現(xiàn)形式是怎么樣的,數(shù)據(jù)模型中的存在數(shù)據(jù)的基本單元都是項(xiàng)(item), 每一個(gè)項(xiàng)有一個(gè)行號(hào)、一個(gè)列號(hào),還有一個(gè)父項(xiàng)(parent item)。在列表和表格模式下,所有的項(xiàng)都有一個(gè)相同的頂層項(xiàng)(root item); 在樹狀結(jié)構(gòu)中,行號(hào)、列號(hào)、父項(xiàng)稍微復(fù)雜一點(diǎn),但是由這3個(gè)參數(shù)完全可以定義一個(gè)項(xiàng)的位置,從而存取項(xiàng)的數(shù)據(jù)。
下圖就是QT官方提供的數(shù)據(jù)模型的幾種表現(xiàn)形式:
實(shí)踐情況
先定義一個(gè)treeModel,這也是最關(guān)鍵的地方:頭文件:
#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設(shè)置QTreeView表頭 QStringList strHeads = QStringList(QString::fromUtf8("姓名")); strHeads.append(QString::fromUtf8("性別")); strHeads.append(QString::fromUtf8("年齡")); m_standardItemModel->setHorizontalHeaderLabels(strHeads); QStandardItem *item1 = new QStandardItem(QString::fromUtf8("四年級(jí)")); 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("五年級(jí)")); 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(); // 槽函數(shù) 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; }
實(shí)現(xiàn)效果:
總結(jié)
其實(shí)這里就是這樣一個(gè)類似的數(shù)據(jù)結(jié)構(gòu):
struct item{ int row; int rank; item parent; QString data; vector<item> childrenList; }
記準(zhǔn)官方這張圖,就明白怎么用了,其實(shí),很簡單:
到此這篇關(guān)于QT樹的具體項(xiàng)目實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)QT樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)std::set的示例項(xiàng)目
std::set是C++標(biāo)準(zhǔn)庫中的關(guān)聯(lián)容器,提供有序唯一元素集合,本文就來介紹一下std::set的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02Matlab實(shí)現(xiàn)簡單擴(kuò)頻語音水印算法詳解
本文主要介紹了通過MATLAB設(shè)計(jì)并實(shí)現(xiàn)一種基于音頻的擴(kuò)頻水印算法,從而了解參數(shù)對(duì)擴(kuò)頻水印算法性能的影響。代碼具有一定的價(jià)值,感興趣的小伙伴可以關(guān)注一下2021-11-11詳解C++11 原始字符串字面量(Json字符串表達(dá)更方便)
原始字符串字面量(Raw String Literal)是C++11引入的一種字符串表示方式,用于簡化字符串的定義,特別是當(dāng)字符串中包含大量特殊字符(如換行符、雙引號(hào)等)時(shí),這篇文章給大家介紹C++11原始字符串字面量(Json字符串表達(dá)更方便)的相關(guān)知識(shí),感興趣的朋友一起看看吧2025-03-03C語言中初始、增加和刪除進(jìn)程信號(hào)的操作方法簡介
這篇文章主要介紹了C語言中初始、增加和刪除進(jìn)程信號(hào)的操作方法簡介,分別是sigemptyset函數(shù)、sigaddset函數(shù)和sigdelset函數(shù)的用法,需要的朋友可以參考下2015-09-09解析設(shè)計(jì)模式中的Prototype原型模式及在C++中的使用
這篇文章主要介紹了設(shè)計(jì)模式中的Prototype原型模式及在C++中的使用,需要的朋友可以參考下2016-03-03