如何在Qt中创建一个恒定的只读模型/视图架构?

时间:2012-04-03 06:44:45

标签: c++ qt model-view

假设我想使用QTableViewQAbstractTableModel类来实现模型/视图架构。所以我将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的常量方法。

3 个答案:

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