します。https://blog.51cto.com/9291927/1890098より転載
、QAbstractItemModelカスタムモデルは、階層的なデータソースをサポートするのに十分に柔軟なインターフェースを提供し、データは、CRUD操作することができ、ドラッグアンドドロップをサポートすることが可能です。QTは、リストやテーブルとの関連での使用に適した非階層データモデルの開発を簡素化するためにQAbstarctListModelとQAbstractTableModel 2つのクラスを提供します。
管理モデル、適切なビューのどのようなデータ構造を検討するためのカスタムモデル。データモデルのみをリストまたは表の表示に使用されている場合は、QAbstractListModelやQAbstractTableModelを使用することができます。しかし、データモデルは階層構造を有し、かつ唯一のQAbstractItemModelを選択し、ユーザーの階層に表示されている必要があります。かかわらず、基礎となるデータ構造が編成されているのは、我々はより多くのビューモデルに簡単にアクセスでき、規格に適合しQAbstractItemModel直接インタフェースを考慮する必要があります。
CurrencyModel.hファイル:
#ifndefのCURRECYMODEL_H の#define CURRECYMODEL_H の#include <QAbstractTableModel> の#include <QAbstractItemModel> の#include <QMap> クラス CurrecyModel:公共QAbstractTableModel { Q_OBJECTの公共: 明示 CurrecyModel(QObjectを*親= 0 )。// ヘッダ: QVariant headerData(int型のセクション、Qtの::オリエンテーションオリエンテーション、int型の役割= Qtの:: DisplayRole)のconst オーバーライド。// 基本的な機能:int型をrowCount( constの QModelIndex&親= QModelIndex())のconst オーバーライド。 int型 columnCountの(のconst QModelIndex&親= QModelIndex())のconst オーバーライド。 QVariantデータ(constの QModelIndex&インデックス、int型の役割= Qtの:: DisplayRole)のconst オーバーライド。 Qtの:: ItemFlagsフラグ(のconst QModelIndex&インデックス)のconst ; ブール値にsetData(のconst QModelIndex&インデックス、constの QVariant&値、int型の役割= Qtの:: EditRole)。 無効 setCurrencyMap(constの QMap <QStringの、ダブル >&マップ); プライベート: QStringのcurrencyAt(int型オフセット)のconst ; QMap <QStringの、ダブル > currencyMap。 }。 #endifの // CURRECYMODEL_H
CurrencyModel.cppファイル:
#include " CurrecyModel.h " CurrecyModel :: CurrecyModel(QObjectを * 親) :QAbstractTableModel(親) { } QVariant CurrecyModel :: headerData(int型のセクション、Qtの::オリエンテーションオリエンテーション、int型の役割)のconst { 場合(役割=!のQt: :DisplayRole)は { 返す)(QVariantします。 } 戻りcurrencyAt(セクション) } INT CurrecyModel ::をrowCount(CONST QModelIndex&親)のconst { 場合(parent.isValid()) リターン 0 ; 返すcurrencyMap.countを(); } INT CurrecyModel :: columnCountの(CONST QModelIndex&親)のconst { 場合(parent.isValid()) 戻り 0 。 返すcurrencyMap.countを(); } QVariant CurrecyModel ::データ(constの QModelIndex&インデックス、int型の役割)のconst { 場合(!index.isValid()) を返すQVariantを(); もし(役割== Qtの:: TextAlignmentRole) { リターン int型(Qtの:: AlignRight |Qtの:: AlignVCenter)。 } そう であれば(役割== Qtの:: DisplayRole ||役割== Qtの:: EditRole) { QStringのrowCurrency = currencyAt(index.row())。 QStringのcolumnCurrency = currencyAt(index.column())。 もし(currencyMap.value(rowCurrency)== 0.0 ) { 戻り " #### " 。 } 二量= currencyMap.value(columnCurrency) / currencyMap.value(rowCurrency)。 返すのQStringを(" %1 ").arg(量、0、' F '、4 ); } を返す)(QVariantします。 } BOOL CurrecyModel ::のsetData(CONST QModelIndex&インデックス、CONST QVariant&値、int型の役割) { 場合(index.isValid()&& index.row()!= index.column()&&役割== Qtの:: EditRole) { QStringのcolumnCurrency = headerData(index.column()、Qtの::横長、Qtの:: DisplayRole).toString(); QStringのrowCurrency = headerData(index.row()、Qtの::縦長、Qtの:: DisplayRole).toString(); currencyMap.insert(columnCurrency、value.toDouble() * currencyMap.value(rowCurrency))。 dataChanged(インデックス、インデックス)を放出します。 返す 真; } を返す 偽。 } Qtの:: ItemFlags CurrecyModel ::フラグ(CONST QModelIndex・インデックス)のconst { Qtの:: ItemFlagsフラグ = QAbstractItemModel ::フラグ(インデックス) もし(!index.row()= index.column()) { 旗 | = Qtの:: ItemIsEditable。 } 戻りフラグを、 } QStringのCurrecyModel :: currencyAt(int型)オフセットCONSTを { リターン(currencyMap.begin()+ オフセット).KEY(); } ボイド CurrecyModel :: setCurrencyMap(CONST QMap <QStringの、二重 >・マップ) { beginResetModel()。 currencyMap = マップ。 endResetModel(); }
QTableViewフォームはUIのメインウィンドウにコントロールを追加します。
MainWindow.cpp
#include " mainwindow.h " の#include " ui_mainwindow.h " の#include " CurrecyModel.h " メインウィンドウ::メインウィンドウ(QWidgetの * 親): QMainWindow(親)、 UI(新しい宇井::メインウィンドウ) { UI - > setupUi(この); QMap <QStringの、ダブル > データ; データ[ " USD " ] = 1.0000 。 データ[ " CNY " ] = 0.1628 。 データ[ " GBP " ] = 1.5361 。 データ[ " EUR " ] = 1.2992 。 データ[ " HKD " ] = 0.1289 。 CurrecyModel *モデル= 新しい CurrecyModel(この); UI - > tableView-> 使ってsetModel(モデル); モデル - > setCurrencyMap(データ); } メインウィンドウ::〜メインウィンドウ() { 削除UIを、 }
次のような効果があります