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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt系列文章之 QAbstractItemModel(上)

發布時間:2023/12/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt系列文章之 QAbstractItemModel(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章對Qt MVC框架下的模型類進行大致介紹,本文基于QAbstractItemModel來開發第一個用戶模型類,重點關注各個接口的實現。

QAbstractItemModel

用戶類需要集成基類QAbstractItemModel來開發自己的數據模型,一種方法就是按照之前的方式新建一個CPP類,基類選擇QAbstractItemModel,然后在代碼之中依次對每個需要實現的函數進行重載定義和實現;不過這樣做會比較麻煩,而且由于模型虛方法很多,容易出錯和遺漏。Qt開發器提供了更好的方法幫助用戶快速開發自己的數據模型。

如下,右鍵項目選擇新建,選擇Qt大類中的Qt Item Model:

輸入自己需要定義的類名稱如CustomItemModel,基類有三個可以選擇,此處選擇QAbstractItemModel,下面的屬性都勾上。當然這些屬性可以根據具體的需要選擇是否勾選。

點擊下一步新建,即可生成用戶模型類的頭文件和源文件,此時Qt會創建好所有需要定義實現的重載函數,頭文件代碼如下:

#ifndef CUSTOMITEMMODEL_H #define CUSTOMITEMMODEL_H#include <QAbstractItemModel>class CustomItemModel : public QAbstractItemModel {Q_OBJECTpublic:explicit CustomItemModel(QObject *parent = nullptr);// Header:QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;// Basic functionality:QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const override;QModelIndex parent(const QModelIndex &index) const override;int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;// Fetch data dynamically:bool hasChildren(const QModelIndex &parent = QModelIndex()) const override;bool canFetchMore(const QModelIndex &parent) const override;void fetchMore(const QModelIndex &parent) override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;// Editable:bool setData(const QModelIndex &index, const QVariant &value,int role = Qt::EditRole) override;Qt::ItemFlags flags(const QModelIndex& index) const override;// Add data:bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override;// Remove data:bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override;private: };#endif // CUSTOMITEMMODEL_H

此時生成的源文件代碼如下:

#include "customitemmodel.h"CustomItemModel::CustomItemModel(QObject *parent): QAbstractItemModel(parent) { }QVariant CustomItemModel::headerData(int section, Qt::Orientation orientation, int role) const {// FIXME: Implement me! }bool CustomItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) {if (value != headerData(section, orientation, role)) {// FIXME: Implement me!emit headerDataChanged(orientation, section, section);return true;}return false; }QModelIndex CustomItemModel::index(int row, int column, const QModelIndex &parent) const {// FIXME: Implement me! }QModelIndex CustomItemModel::parent(const QModelIndex &index) const {// FIXME: Implement me! }int CustomItemModel::rowCount(const QModelIndex &parent) const {if (!parent.isValid())return 0;// FIXME: Implement me! }int CustomItemModel::columnCount(const QModelIndex &parent) const {if (!parent.isValid())return 0;// FIXME: Implement me! }bool CustomItemModel::hasChildren(const QModelIndex &parent) const {// FIXME: Implement me! }bool CustomItemModel::canFetchMore(const QModelIndex &parent) const {// FIXME: Implement me!return false; }void CustomItemModel::fetchMore(const QModelIndex &parent) {// FIXME: Implement me! }QVariant CustomItemModel::data(const QModelIndex &index, int role) const {if (!index.isValid())return QVariant();// FIXME: Implement me!return QVariant(); }bool CustomItemModel::setData(const QModelIndex &index, const QVariant &value, int role) {if (data(index, role) != value) {// FIXME: Implement me!emit dataChanged(index, index, QVector<int>() << role);return true;}return false; }Qt::ItemFlags CustomItemModel::flags(const QModelIndex &index) const {if (!index.isValid())return Qt::NoItemFlags;return Qt::ItemIsEditable; // FIXME: Implement me! }bool CustomItemModel::insertRows(int row, int count, const QModelIndex &parent) {beginInsertRows(parent, row, row + count - 1);// FIXME: Implement me!endInsertRows(); }bool CustomItemModel::insertColumns(int column, int count, const QModelIndex &parent) {beginInsertColumns(parent, column, column + count - 1);// FIXME: Implement me!endInsertColumns(); }bool CustomItemModel::removeRows(int row, int count, const QModelIndex &parent) {beginRemoveRows(parent, row, row + count - 1);// FIXME: Implement me!endRemoveRows(); }bool CustomItemModel::removeColumns(int column, int count, const QModelIndex &parent) {beginRemoveColumns(parent, column, column + count - 1);// FIXME: Implement me!endRemoveColumns(); }

不過此時的代碼無法編譯,我們需要對每個方法進行具體代碼實現。此部分將在后續文章中依次介紹。


歡迎同好溝通交流,批評指正,歡迎關注我的公號:不如起而行之

總結

以上是生活随笔為你收集整理的Qt系列文章之 QAbstractItemModel(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。