gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:01:53 31 4
gpt4 key购买 nike

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

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

这超出了我的预期。我本以为命名单个单元格的 dataChanged() 只会导致::data() 调用请求该单元格的数据。毕竟,这是我的表格模型所说的唯一已更改的单元格。但 Qt 框架似乎非常群居,会查询所有单元格。

我显然对 dataChanged() 信号的意图理解不够。

有没有一种方法可以告诉 QTableView 仅更新一个单元格和一个单元格,而不会将所有额外的信息发送到我的表格模型?

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

// 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();

最佳答案

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

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

<小时/>

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

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

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

关于qt - 发出 dataChanged(createIndex(1,1),createIndex(1,1)) 会导致许多::data 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9844242/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com