Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt emit dataChanged(createIndex(1,1),createIndex(1,1))会导致许多::数据调用_Qt_Qtableview_Qabstracttablemodel - Fatal编程技术网

Qt emit dataChanged(createIndex(1,1),createIndex(1,1))会导致许多::数据调用

Qt emit dataChanged(createIndex(1,1),createIndex(1,1))会导致许多::数据调用,qt,qtableview,qabstracttablemodel,Qt,Qtableview,Qabstracttablemodel,我有一个QTableView和一个QAbtractTableModel子级的对应实例 我惊讶地发现,如果我的表模型实例发出一个命名单个单元格的dataChanged,那么Qt框架将对我的表模型的::data()成员函数发出大量调用。这些调用的行/列范围似乎覆盖了屏幕上的全部内容+一些额外内容 这比我预料的要多。我本以为命名单个单元格的dataChanged()只会导致::data()调用请求该单元格的数据。毕竟,这是我的表格模型所说的唯一一个被改变的单元格。但是Qt框架似乎非常合群,并且查询所有

我有一个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();
//声明
#包括
类SimpleModel:PublicQAbstractTableModel
{
Q_对象
私人:
bool_post_emit;
公众:
显式SimpleModel(QObject*parent=0);
int rowCount(常量QModelIndex&parent=QModelIndex())常量;
int columnCount(常量QModelIndex&parent=QModelIndex())常量;
QVariant数据(常量QModelIndex&index,int-role=Qt::DisplayRole)常量;
void issueEmit();
};
//实施
#包括
#包括
#包括“simplemodel.h”
SimpleModel::SimpleModel(QObject*parent):QAbstractTableModel(parent),\u post\u emit(false){}
int SimpleModel::行计数(常量QModelIndex&parent)常量{
返回100;
}
int SimpleModel::columnCount(常量QModelIndex&parent)常量{
返回100;
}
QVariant SimpleModel::data(常量QModelIndex&index,int角色)常量{
如果(角色==Qt::DisplayRole){
如果(_post_emit){
静态无符号s_调用=0;
s_调用++;
printf(“数据调用:%d\n”,s_调用);
}
返回((rand()%10000)/1000.00);
}
返回QVariant();
}
void SimpleModel::issueEmit(){
_post_emit=true;
发出dataChanged(createIndex(1,1),createIndex(1,1));
}
//用法
QTableView*表=新的QTableView;
表->设置最小尺寸(1200900);
SimpleModel*模型=新SimpleModel;
表->设置模型(模型);
表->显示();
模型->发布限制();

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


这里的争论真的很有趣。模型中的每个项目都包含许多QVariant,这些QVariant维护关于该项目的不同信息

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

描述外观和元数据(以及相关类型)的角色:
常量值说明
Qt::FontRole 6用于使用默认委托呈现的项目的字体。(QFont)
TextAlignmentRole 7使用默认委托呈现的项目的文本对齐。(Qt::AlignmentFlag)

Qt::BackgroundRole 8用于使用默认委托呈现的项目的背景笔刷。(QBrush)

您是说::data()只会在单个单元格中使用emit dataChanged()调用“n-roles”次吗?因为我相信我正在观察“n行”和“n列”以及“n角色”调用的数量。如果我能拿出一个我所观察到的小例子,然后继续下去,那可能是最好的。我会在有了这些信息后再发。我已经用一些示例代码更新了我的原始帖子,这些代码说明了我认为我正在观察的问题。对我来说,问题是一个用于更新单个单元格的emit dataChanged()会生成大量对::data()的调用。我已经提交了一个文件,因为这可能是更好的主页。我将根据需要进行更新或关闭。