首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Qt中创建一个常量正确的只读模型/视图架构?

如何在Qt中创建一个常量正确的只读模型/视图架构?
EN

Stack Overflow用户
提问于 2012-04-03 14:44:45
回答 3查看 1.3K关注 0票数 2

假设我想使用QTableViewQAbstractTableModel类实现一个模型/视图架构。因此,我继承了QAbstractTableModel以创建类MyModel并实现QAbstractTableModel接口。然后使用setModel方法将此模型的实例连接到QTableView实例。

代码语言:javascript
运行
复制
 #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();
 }

但是如何才能使模型成为只读的呢?我不能声明

代码语言:javascript
运行
复制
const MyModel myModel(0);

因为setModel接受一个非常数参数。我只重新实现了QAbstractTableModel的常量方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-03 15:29:01

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

你想让你的底层数据是不可变的吗--这样QTableView的编辑就不可能了?然后就不允许编辑模型了--比如不实现setData

另请注意,standard implementation

代码语言:javascript
运行
复制
Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const

不会返回足够的Qt::ItemIsEditable

您必须注意不要在UI之外修改模型(请注意,在没有发送适当信号的情况下在外部修改它可能会导致不好的结果)。但这是你的代码--这不应该是问题。

票数 5
EN

Stack Overflow用户

发布于 2012-04-03 15:32:17

您不能使模型保持常量,因为视图需要能够执行一些影响QAbstractItemModel对象的操作,例如创建持久的模型索引。

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

代码语言:javascript
运行
复制
Qt::ItemFlags MyModel::flags ( const QModelIndex & index ) const
{
    return QAbstractTableModel::flags(index) & ~Qt::ItemIsEditable;
}
票数 2
EN

Stack Overflow用户

发布于 2012-04-03 15:32:19

假设您的意思是最终用户只读,而不是程序员只读,this article解释说,只有当您重新实现QAbstractItemModel::flags()QAbstractItemModel::setData()以及不太重要的QAbstractItemModel::setHeaderData()时,模型才是可编辑的。

此外,您需要为只读模型重新实现的函数都是 const

代码语言:javascript
运行
复制
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 { }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9988342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档