Qtのカスタム編集可能なモデルビュー

  します。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を、
}

  次のような効果があります

  

 

おすすめ

転載: www.cnblogs.com/jiangson/p/10954421.html