Название: QTableView/QAbstractItemModel - очереной глюк(emit dataChanged)
Отправлено: spectre71 от Май 27, 2009, 13:25
Если сделать: C++ (Qt) void QTestModel::updateRow(int row) { emit dataChanged(index(row, 0, QModelIndex()), index(row, columnCount()-1, QModelIndex())); }
то обновление происходит для всех строк (по крайней мере видимых)! А если так: C++ (Qt) void QTestModel::updateRowByCells(int row) { for(int i=0; i<columnCount(); i++) { QModelIndex ModelIndex = index(row, i, QModelIndex()); emit dataChanged(ModelIndex, ModelIndex); } }
то все нормально, обновление только для заданной строки Исходники для теста приложены
Название: Re: QTableView/QAbstractItemModel - очереной глюк(emit dataChanged)
Отправлено: Rcus от Май 27, 2009, 13:50
C++ (Qt) void QAbstractItemView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { // Single item changed Q_D(QAbstractItemView); if (topLeft == bottomRight && topLeft.isValid()) { const QEditorInfo editorInfo = d->editorForIndex(topLeft); //we don't update the edit data if it is static if (!editorInfo.isStatic && editorInfo.editor) { QAbstractItemDelegate *delegate = d->delegateForIndex(topLeft); if (delegate) { delegate->setEditorData(editorInfo.editor, topLeft); } } if (isVisible() && !d->delayedPendingLayout) { // otherwise the items will be update later anyway d->viewport->update(visualRect(topLeft)); } return; } d->updateEditorData(topLeft, bottomRight); if (!isVisible() || d->delayedPendingLayout) return; // no need to update d->viewport->update(); }
Проще говоря если изменилась одна ячейка то можно поиграть в оптимизацию, а если больше то дольше выяснять что именно изменилось, легче все обновить. Глюком не считаю
Название: Re: QTableView/QAbstractItemModel - очереной глюк(emit dataChanged)
Отправлено: spectre71 от Май 27, 2009, 16:45
Да это не глюк, поскольку глюк - это баг. Здесь фича - кривая реализация.
Я целый день убил дабы найти место где у меня тормозит программа. Если я посылаю сигнал на изменение строки, я естественно думаю что будет перересовываться видимая область для заданной строки и то если она видима.
|