发出dataChanged(createIndex(1,1),createIndex(1,1))会导致许多:: data调用

时间:2012-03-23 17:59:41

标签: qt qtableview qabstracttablemodel

我有一个QTableView和一个QAbtractTableModel孩子的相应实例。

我很惊讶地发现,如果我的表模型实例发出一个命名单个单元格的dataChanged,那么Qt框架将向我的表模型的:: data()成员函数发出大量调用。这些调用的行/列范围似乎涵盖屏幕上的整个范围+一些额外的。

这比我预期的要多。我原以为命名单个单元格的dataChanged()只会导致:: data()调用请求该单元格的数据。毕竟,这是我的桌子模型所说的唯一一个细胞被改变了。但Qt框架似乎非常合群,并询问所有细胞。

我显然对dataChanged()信号的意图有了深刻的理解。

有没有办法告诉QTableView只更新一个单元格和一个单元格而没有将所有额外的聊天发送到我的表模型?

更新:包含代码示例 这里的示例是用于创建表的头,源和一大块代码。对我来说,表格显示有12列和29行。在最后的“issueEmit”调用之后,:: data将被调用1044次,因为单个单元格的dataChanged()信号。

// Declaration
#include <QAbstractTableModel>
class SimpleModel : public QAbstractTableModel
{
  Q_OBJECT
private:
  bool _post_emit;
public:
  explicit SimpleModel(QObject *parent=0);
  int rowCount(const QModelIndex &parent = QModelIndex()) const;
  int columnCount(const QModelIndex &parent = QModelIndex()) const;
  QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  void issueEmit();
};

// Implementation
#include <stdlib.h>
#include <stdio.h>
#include "simplemodel.h"
SimpleModel::SimpleModel(QObject *parent) : QAbstractTableModel(parent), _post_emit(false) { }
int SimpleModel::rowCount(const QModelIndex &parent) const {
  return 100;
}
int SimpleModel::columnCount(const QModelIndex &parent) const {
  return 100;
}
QVariant SimpleModel::data(const QModelIndex &index, int role) const {
  if (role==Qt::DisplayRole) {
    if (_post_emit) {
       static unsigned s_calls=0;
       s_calls++;
       printf("Data calls: %d\n",s_calls);
    }
    return ((rand()%10000)/1000.00);
  }
  return QVariant();
}
void SimpleModel::issueEmit() {
  _post_emit=true;
  emit dataChanged(createIndex(1,1),createIndex(1,1));
}

// Usage
QTableView *table=new QTableView;
table->setMinimumSize(1200,900);
SimpleModel *model=new SimpleModel;
table->setModel(model);
table->show();
model->issueEmit();

1 个答案:

答案 0 :(得分:1)

QVariant QStandardItem::data ( int role = Qt::UserRole + 1 ) const [virtual]

返回给定角色的项目数据,如果没有该角色的数据,则返回无效的QVariant。


这里的论点真的很有意思。模型中的每个项目都包含许多QVariants,这些QVariant维护有关项目的不同信息。

这些变种都被分配了roles。每当您发出数据发生更改时,模型都必须重新绘制项目。要重新绘制项目,它必须查看许多不同的数据(下面包含的小摘录)

描述外观和元数据的角色(具有相关类型):
常数值描述
Qt :: FontRole 6用于使用默认委托呈现的项目的字体。 (QFont)
Qt :: TextAlignmentRole 7使用默认委托呈现的项目的文本对齐方式。 (QT :: AlignmentFlag)
Qt :: BackgroundRole 8用于使用默认委托呈现的项目的背景画笔。 (QBrush)