Russian Qt Forum

Qt => Model-View (MV) => Тема начата: spectre71 от Май 27, 2009, 13:25



Название: 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
Да это не глюк,  поскольку глюк - это баг.
Здесь фича - кривая реализация.

Я целый день убил дабы найти место где у меня тормозит программа.
Если я посылаю сигнал на изменение строки, я естественно думаю что будет перересовываться видимая область для заданной строки и то если она видима.