假设我想使用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的常量方法。
答案 0 :(得分:5)
在这种情况下const
是什么意思?你想达到什么目的?
您希望您的基础数据是不可变的 - 因此来自QTableView
的版本是不可能的吗?然后只是禁止编辑模型 - 例如通过不实施setData
。
另请注意<{3}}
Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const
不会返回Qt::ItemIsEditable
这就足够了。
您必须注意不要在UI之外修改模型(请注意,在不发送适当信号的情况下在外部修改模型可能会导致坏事)。但是因为这是你的代码 - 这应该不是问题。
答案 1 :(得分:2)
您无法使模型保持不变,因为有些视图需要能够影响QAbstractItemModel对象,例如创建持久模型索引。
传达您的模型对视图是只读的这一事实的最佳方式是覆盖QAbstractTableModel::flags
以始终取消设置ItemIsEditable:
Qt::ItemFlags MyModel::flags ( const QModelIndex & index ) const
{
return QAbstractTableModel::flags(index) & ~Qt::ItemIsEditable;
}
答案 2 :(得分:2)
假设您的意思是只读最终用户,而不是程序员只读,this article解释说,只有在重新实施QAbstractItemModel::flags()
时,该模型才可编辑,{ {1}},不太重要QAbstractItemModel::setData()
。
此外,您需要为只读模型重新实现的功能 所有QAbstractItemModel::setHeaderData()
:
const