假设我想使用QTableView和QAbstractTableModel类实现一个模型/视图架构。因此,我继承了QAbstractTableModel以创建类MyModel并实现QAbstractTableModel接口。然后使用setModel方法将此模型的实例连接到QTableView实例。
#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的常量方法。
发布于 2012-04-03 15:29:01
在这种情况下,你说的const是什么意思?你想实现什么目标?
你想让你的底层数据是不可变的吗--这样QTableView的编辑就不可能了?然后就不允许编辑模型了--比如不实现setData。
另请注意,standard implementation的
Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const不会返回足够的Qt::ItemIsEditable。
您必须注意不要在UI之外修改模型(请注意,在没有发送适当信号的情况下在外部修改它可能会导致不好的结果)。但这是你的代码--这不应该是问题。
发布于 2012-04-03 15:32:17
您不能使模型保持常量,因为视图需要能够执行一些影响QAbstractItemModel对象的操作,例如创建持久的模型索引。
传达模型对视图是只读的这一事实的最佳方法是覆盖QAbstractTableModel::flags以始终取消设置ItemIsEditable:
Qt::ItemFlags MyModel::flags ( const QModelIndex & index ) const
{
return QAbstractTableModel::flags(index) & ~Qt::ItemIsEditable;
}发布于 2012-04-03 15:32:19
假设您的意思是最终用户只读,而不是程序员只读,this article解释说,只有当您重新实现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 { }https://stackoverflow.com/questions/9988342
复制相似问题