QTableView と、対応する QAbtractTableModel の子のインスタンスがあります。
テーブル モデル インスタンスが 1 つのセルを指定する dataChanged を発行すると、Qt フレームワークがテーブル モデルの ::data() メンバー関数に対して多数の呼び出しを発行することに驚きました。これらの呼び出しの行/列の範囲は、画面上にあるものの範囲全体 + 余分なものをカバーしているように見えます。
これは私が予想した以上のものです。単一のセルに名前を付ける dataChanged() は、そのセルのデータを要求する ::data() 呼び出しのみになると考えていました。結局のところ、私のテーブル モデルが変更されたと言った唯一のセルです。しかし、Qt フレームワークは非常に群生しているようで、すべてのセルについて問い合わせます。
私は明らかに dataChanged() シグナルの意図を理解していません。
QTableView に 1 つのセルと 1 つのセルのみを更新するように指示する方法はありますか?
更新: コード サンプルを含む ここの例は、テーブルを作成するためのヘッダー、ソース、およびコードのチャンクです。私の場合、テーブルは 12 列 29 行で表示されます。最後の「issueEmit」呼び出しの後、::data は、1 つのセルに対する dataChanged() シグナルのために、全部で 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();