如何在Qt中创建一个持续正确的只读模型/视图架构

How to make a constant correct read only model/view architecture in Qt?

本文关键字:只读 模型 视图 一个 Qt 创建      更新时间:2023-10-16

假设我想使用QTableViewQAbstractTableModel类实现一个模型/视图体系结构。因此,我将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的常量方法。

在这种情况下,const是什么意思?你想实现什么?

您是否希望您的底层数据是不可变的,这样就不可能从QTableView进行编辑?然后不允许编辑模型,例如不实现setData

还要注意的标准实施

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

将不会返回CCD_ 11,这是足够的。

您必须注意不要在UI之外修改模型(请注意,在不发送适当信号的情况下在外部修改模型可能会导致糟糕的事情)。但由于这是您的代码,所以这不应该是一个问题。

不能使模型保持不变,因为视图需要做一些事情来影响QAbstractItemModel对象,例如创建持久模型索引。

传达模型对视图只读这一事实的最佳方法是重写QAbstractTableModel::flags以始终取消设置ItemIsEditable:

Qt::ItemFlags MyModel::flags ( const QModelIndex & index ) const
{
    return QAbstractTableModel::flags(index) & ~Qt::ItemIsEditable;
}

假设您的意思是最终用户只读,而不是程序员只读,本文解释了只有在重新实现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 { }