日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt 模型视图编程之表头设置

發(fā)布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt 模型视图编程之表头设置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

Qt 模型視圖編程中模型定義了標(biāo)準(zhǔn)接口對數(shù)據(jù)進行訪問,可根據(jù)需求繼承對應(yīng)的抽象模型類來實現(xiàn)自定義的數(shù)據(jù)模型。一個基本的數(shù)據(jù)模型至少要實現(xiàn)以下虛函數(shù):
①.rowCount:行數(shù),返回要顯示多少行;
②.columnCount:列數(shù),返回要顯示多少列
③.data:讀取數(shù)據(jù),返回每個單元格要顯示的內(nèi)容
視圖不會主動更新數(shù)據(jù)的顯示,模型使用 dataChanged 信號通知視圖數(shù)據(jù)發(fā)生變化。

表頭相關(guān)接口

①.概述
在視圖界面中除了顯示數(shù)據(jù)外,還包含了橫向、縱向兩個表頭的顯示;在數(shù)據(jù)模型中也提供了對表頭進行設(shè)置的接口。
②.關(guān)鍵虛函數(shù)
headerData:數(shù)據(jù)模型對外提供的獲取表頭顯示內(nèi)容的接口;
setHeaderData:數(shù)據(jù)模型對外提供的可設(shè)置表頭的內(nèi)容的接口。
③.表頭更新信號
headerDataChanged:表頭內(nèi)容更新信號,通知界面更新顯示。
④.默認表頭內(nèi)容
橫向和縱向表頭默認值顯示為對應(yīng)的行號和列號,從 1 開始;當(dāng)不需自定義表頭內(nèi)容時,直接調(diào)用基類的方法返回其默認實現(xiàn)即可。

設(shè)置模型表頭內(nèi)容

①.概述
一般在用于數(shù)據(jù)顯示時其表頭內(nèi)容在初始化時設(shè)定好即可,通常無需變動。
②.TableModelDemo.h 文件

#include <QAbstractTableModel> ? struct student {QString name;int age;QString sex; };//測試用數(shù)據(jù)結(jié)構(gòu) Q_DECLARE_METATYPE(student) ? class TableModelDemo : public QAbstractTableModel {Q_OBJECT ? public:TableModelDemo(QList<student> & list, QList<QString> & headers, QObject *parent = nullptr):QAbstractTableModel(parent),m_list(list),m_header(headers){};~TableModelDemo() {}; public:int rowCount(const QModelIndex &parent) const override { return m_list.size(); }//行數(shù)int columnCount(const QModelIndex &parent) const override { return m_header.size(); }//列數(shù)QVariant data(const QModelIndex &index,int role) const override;//Qt::ItemFlags flags(const QModelIndex &index)const override;//bool setData(const QModelIndex &index,const QVariant & value, int role = Qt::EditRole) override;//bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;// bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;//QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;//獲取表頭 private:QList<student> &m_list;//對內(nèi)存中數(shù)據(jù)的引用QList<QString> m_header;//表頭內(nèi)容 public:void setCustomData(QList<student> & l);void setHeaderData(QList<QString> & headers);};

③.TableModelDemo.cpp 文件

QVariant TableModelDemo::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const {if (orientation == Qt::Horizontal)//只更改橫向表頭{switch (role){case Qt::DisplayRole:return m_header[section];default:break;}}return QAbstractTableModel::headerData(section, orientation, role);//返回默認實現(xiàn) }

④.數(shù)據(jù)模型初始化

student s; s.age = 18; s.name = "張三"; s.sex = "男"; m_list.append(s); ? s.age = 16; s.name = "李四"; s.sex = "女"; m_list.append(s); ? QList<QString> m_header{ "姓名","年齡","性別" }; auto mode = new TableModelDemo(m_list, m_header); ? ui.tableView->setModel(mode);

更改模型表頭內(nèi)容

①.更改單個表頭內(nèi)容

通過 setHeaderData 可以設(shè)置單個表頭內(nèi)容的顯示,并通過信號通知視圖刷新顯示:

bool TableModelDemo::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role /*= Qt::EditRole*/) {if (orientation == Qt::Horizontal){m_header[section] = value.toString(); ?emit headerDataChanged(orientation, section, section); ?return true;}return false; }

②.更改整個表頭內(nèi)容

當(dāng)視圖關(guān)聯(lián)的模型變更時,通常也需要對其表頭內(nèi)容進行對應(yīng)更改:

void TableModelDemo::setCustomData(QList<student> & l) {int m_rowCount = rowCount(QModelIndex());int m_colCount = columnCount(QModelIndex()); ?m_list = l;emit dataChanged(index(0, 0), index(m_rowCount - 1, m_rowCount - 1)); }

總結(jié)

以上是生活随笔為你收集整理的Qt 模型视图编程之表头设置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。