У меня есть 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();