【问题标题】:How to make a constant correct read only model/view architecture in Qt?如何在 Qt 中制作一个恒定正确的只读模型/视图架构?
【发布时间】:2012-04-16 19:35:52
【问题描述】:

假设我想使用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 的常量方法。

【问题讨论】:

    标签: c++ qt model-view


    【解决方案1】:

    在这种情况下,const 是什么意思?你想达到什么目标?

    您是否希望您的基础数据是不可变的 - 这样来自QTableView 的版本就不可能了?然后只是不允许编辑模型 - 例如通过不实施setData

    还要注意

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

    不会返回Qt::ItemIsEditable,这就足够了。

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

    【讨论】:

    • 我只是希望能够使用该对象的常量方法从另一个对象传递模型。这不是什么大问题,但是一旦我使某些方法不恒定,当它应该是恒定的时,这也会传播到使用该方法的其他方法。
    • 我见过使用残酷的const_cast 方法处理此类问题的 Qt 代码。没有那么优雅,有潜在的危险,但是......
    • 这正是我想要的
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      好吧,假设您的意思是最终用户只读,而不是程序员只读,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 { }
      

      【讨论】:

        猜你喜欢
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 2016-06-13
        相关资源
        最近更新 更多