Russian Qt Forum

Qt => Model-View (MV) => Тема начата: spectre71 от Июнь 22, 2009, 10:13



Название: QAbstractItemModel - layoutChanged, reset
Отправлено: spectre71 от Июнь 22, 2009, 10:13
Не могу понять в чем приципиальная разница между emit layoutChanged() и reset()


Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: spectre71 от Июнь 22, 2009, 10:28
Задача на самом деле такая:
Есть наследованная модель.
Есть метод initialize(MyData...)
1) в методе initialize в определенный момент необходимо заблокировать работу с данными модели, поскольку некоторые указатели во время переинициализации могут быть невалидными.
2) Сообщить View что модель изменилась.

думал что сделаю так:
initialize(...) {
  emit modelAboutToBeReset();
  .....
  .....
  emit  modelReset();
}

Но данные сигналы в привате(хотя в доке про это ничего нет, явная ошибка либо в доке либо в коде!)
Можно ли использовать в моем случае:
 layoutAboutToBeChanged ()
 layoutChanged ()
или это не безопасно.

Как сделать правильно?





Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: Barmaglodd от Июнь 22, 2009, 10:55
Почему в привате? От какого класса наследовались? Я при наследовании от QAbstractItemModel, QAbstractListModel, QAbstractITableModel без проблем их использую.


Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: spectre71 от Июнь 22, 2009, 11:01
Почему в привате? От какого класса наследовались? Я при наследовании от QAbstractItemModel, QAbstractListModel, QAbstractITableModel без проблем их использую.

Код
C++ (Qt)
class Q_CORE_EXPORT QAbstractItemModel : public QObject
{
   Q_OBJECT
 
..................
.................
 
Q_SIGNALS:
   void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
   void headerDataChanged(Qt::Orientation orientation, int first, int last);
   void layoutChanged();
   void layoutAboutToBeChanged();
 
#if !defined(Q_MOC_RUN) && !defined(qdoc)
private: // can only be emitted by QAbstractItemModel
#endif
   void rowsAboutToBeInserted(const QModelIndex &parent, int first, int last);
   void rowsInserted(const QModelIndex &parent, int first, int last);
 
   void rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
   void rowsRemoved(const QModelIndex &parent, int first, int last);
 
   void columnsAboutToBeInserted(const QModelIndex &parent, int first, int last);
   void columnsInserted(const QModelIndex &parent, int first, int last);
 
   void columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
   void columnsRemoved(const QModelIndex &parent, int first, int last);
 
   void modelAboutToBeReset();
   void modelReset();
 
..................
.................
 
};
 

QT 4.5.1/Windows


Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: Barmaglodd от Июнь 22, 2009, 11:07
А тьфу, точно! :) А почему нельзя reset() после изменения использовать?


Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: spectre71 от Июнь 22, 2009, 11:15
А тьфу, точно! :) А почему нельзя reset() после изменения использовать?
А если многопоточность? Пока я буду обновлять данные, View из другого потока захочет чего-то запросить у модели, а указатели невалидны!
А ставить везде блокировки в комбинации с методами ...begin..."/ "...end..." - маразм. Я так понял что все методы и сигналы "...begin..."/"...end..." и служат в основном для этого, иначе в них мало толку.


Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: Rcus от Июнь 22, 2009, 11:34
Вдруг не то слово... ВНЕЗАПНО!
Мне интересно стало, модель может нормально существовать в другом потоке? Потому что насколько я умею читать представления полагаются на синхронную доставку сигналов.


Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: Barmaglodd от Июнь 22, 2009, 11:41
А если я подключусь после modelAboutToBeReset(), но до modelReset(), и начну к модели обращаться? Может стоит по запросу заполнить внутренние структуры модели, а, когда они уже заполнены, переключиться на их использование, и вызвать reset()?

@Rcus Никогда не задумывался, т.к. с многопоточными приложениями не работал, но тоже интересно.


Название: Re: QAbstractItemModel - layoutChanged, reset
Отправлено: spectre71 от Июнь 22, 2009, 12:12
А если я подключусь после modelAboutToBeReset(), но до modelReset(), и начну к модели обращаться? Может стоит по запросу заполнить внутренние структуры модели, а, когда они уже заполнены, переключиться на их использование, и вызвать reset()?

@Rcus Никогда не задумывался, т.к. с многопоточными приложениями не работал, но тоже интересно.
Такие фокусы не проходят. Даже для изменения значения пременной типа указателя или int, которые используются в разный потоках используется блокировка. Поскольку в общем случае присваевание/чтение это не однотактовые операции и посреди оперции система может перключиться на другой поток, который к примеру попытается прочитать, то что находится на середине стадии присваивания :o
Ну примерно так.
Возможно с однотактовостью я намудрил, а скорее несколько процессорных операций.