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 回答