如何在Qt中创建一个持续正确的只读模型/视图架构
How to make a constant correct read only model/view architecture in Qt?
假设我想使用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的常量方法。
在这种情况下,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 { }
- QTableView:endMoveRows在模型中重置水平页眉大小
- 将IBM Rhapsody模型集成到VS 2019中
- 旋转模型矩阵时的形状失真
- 非常量变量只读位置的赋值
- 是否可以在C++中使变量真正只读
- 成员函数调用和C++对象模型
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 打印 ONNXRUNTIME::图形没有模型
- C++内存模型和位字段的最大序列
- 犰狳C++ - 从常量内存初始化只读矩阵而不复制
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- 以只读模式打开数据库时SQLITE_CANTOPEN错误
- 使用SIR模型的疾病爆发模拟
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何在 ECS 模型中组织实体?
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- Libtorch:如何加载ONNX模型?
- 使用 assimp 加载模型 - 不需要提升?
- 如何在Qt中创建一个持续正确的只读模型/视图架构