Qt系列文章之 QAbstractItemModel(上)
生活随笔
收集整理的這篇文章主要介紹了
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(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DAC输出演示
- 下一篇: 通过Uip WebClient 实现中应