2

QTableViewおよびQAbstractTableModelクラスを使用してモデル/ビューアーキテクチャを実装したいとします。そこで、をサブクラス化しQAbstractTableModelてクラスを作成MyModelし、インターフェイスを実装しQAbstractTableModelます。次に、メソッドQTableViewを使用してこのモデルのインスタンスをインスタンスに接続します。setModel

 #include <QtGui/QApplication>
 #include <QtGui/QTableView>
 #include "mymodel.h"

 int main(int argc, char *argv[])
 {
     QApplication a(argc, argv);
     QTableView tableView;
     MyModel myModel(0);       
     tableView.setModel( &myModel );
     tableView.show();
     return a.exec();
 }

しかし、どうすればモデルを読み取り専用にすることができますか?宣言できません

const MyModel myModel(0);

setModelは非定数引数を取るためです。QAbstractTableModelの定数メソッドのみを再実装しました。

4

3 に答える 3

5

constこの場合はどういう意味ですか?何を達成したいですか?

基になるデータを不変にしたいので、からの編集QTableViewは不可能になりますか?次に、モデルの編集を禁止します。たとえば、を実装しないことによってsetData

また、の標準実装にも注意してください

Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const

Qt::ItemIsEditable十分なリターンはありません。

UIの外部でモデルを変更しないように注意する必要があります(適切なシグナルを送信せずにモデルを外部で変更すると、悪い結果になる可能性があることに注意してください)。しかし、それはあなたのコードなので、これは問題にはならないはずです。

于 2012-04-03T07:29:01.027 に答える
2

永続的なモデルインデックスの作成など、QAbstractItemModelオブジェクトに影響を与えるためにビューが実行できる必要があることがあるため、モデルを一定にすることはできません。

モデルが読み取り専用であるという事実をビューに伝える最良の方法は、QAbstractTableModel::flags常に未設定のItemIsEditableをオーバーライドすることです。

Qt::ItemFlags MyModel::flags ( const QModelIndex & index ) const
{
    return QAbstractTableModel::flags(index) & ~Qt::ItemIsEditable;
}
于 2012-04-03T07:32:17.050 に答える
2

プログラマーによる読み取り専用ではなく、エンドユーザーによる読み取り専用を意味するという前提で、この記事では、、、およびそれほど重要ではないがQAbstractItemModel::flags()、再実装した場合にのみモデルを編集できることを説明します。QAbstractItemModel::setData()QAbstractItemModel::setHeaderData()

さらに、読み取り専用モデル用に再実装する必要のある関数すべてconst次のとおりです。

Qt::ItemFlags TreeModel::flags(QModelIndex const & index) const { }
QModelIndex TreeModel::index(int row, int column, QModelIndex const & parentIndex) const { }
QModelIndex TreeModel::parent(QModelIndex const & childIndex) const { }
QVariant TreeModel::data(QModelIndex const & index, int role) const { }
QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { }
int TreeModel::rowCount(QModelIndex const & parent) const { }
int TreeModel::columnCount(QModelIndex const & parent) const { }
于 2012-04-03T07:32:18.730 に答える