Russian Qt Forum
Октябрь 01, 2024, 20:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView/QAbstractItemModel - очереной глюк(emit dataChanged)  (Прочитано 7834 раз)
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);
 }
}
 

то все нормально, обновление только для заданной строки

Исходники для теста приложены
Записан
Rcus
Гость
« Ответ #1 : Май 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();
}
 

Проще говоря если изменилась одна ячейка то можно поиграть в оптимизацию, а если больше то дольше выяснять что именно изменилось, легче все обновить. Глюком не считаю
« Последнее редактирование: Май 27, 2009, 13:52 от Rcus » Записан
spectre71
Гость
« Ответ #2 : Май 27, 2009, 16:45 »

Да это не глюк,  поскольку глюк - это баг.
Здесь фича - кривая реализация.

Я целый день убил дабы найти место где у меня тормозит программа.
Если я посылаю сигнал на изменение строки, я естественно думаю что будет перересовываться видимая область для заданной строки и то если она видима.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.183 секунд. Запросов: 21.