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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAbstractItemModel - layoutChanged, reset  (Прочитано 6540 раз)
spectre71
Гость
« : Июнь 22, 2009, 10:13 »

Не могу понять в чем приципиальная разница между emit layoutChanged() и reset()
Записан
spectre71
Гость
« Ответ #1 : Июнь 22, 2009, 10:28 »

Задача на самом деле такая:
Есть наследованная модель.
Есть метод initialize(MyData...)
1) в методе initialize в определенный момент необходимо заблокировать работу с данными модели, поскольку некоторые указатели во время переинициализации могут быть невалидными.
2) Сообщить View что модель изменилась.

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

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

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



Записан
Barmaglodd
Гость
« Ответ #2 : Июнь 22, 2009, 10:55 »

Почему в привате? От какого класса наследовались? Я при наследовании от QAbstractItemModel, QAbstractListModel, QAbstractITableModel без проблем их использую.
Записан
spectre71
Гость
« Ответ #3 : Июнь 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
Записан
Barmaglodd
Гость
« Ответ #4 : Июнь 22, 2009, 11:07 »

А тьфу, точно! Улыбающийся А почему нельзя reset() после изменения использовать?
Записан
spectre71
Гость
« Ответ #5 : Июнь 22, 2009, 11:15 »

А тьфу, точно! Улыбающийся А почему нельзя reset() после изменения использовать?
А если многопоточность? Пока я буду обновлять данные, View из другого потока захочет чего-то запросить у модели, а указатели невалидны!
А ставить везде блокировки в комбинации с методами ...begin..."/ "...end..." - маразм. Я так понял что все методы и сигналы "...begin..."/"...end..." и служат в основном для этого, иначе в них мало толку.
Записан
Rcus
Гость
« Ответ #6 : Июнь 22, 2009, 11:34 »

Вдруг не то слово... ВНЕЗАПНО!
Мне интересно стало, модель может нормально существовать в другом потоке? Потому что насколько я умею читать представления полагаются на синхронную доставку сигналов.
Записан
Barmaglodd
Гость
« Ответ #7 : Июнь 22, 2009, 11:41 »

А если я подключусь после modelAboutToBeReset(), но до modelReset(), и начну к модели обращаться? Может стоит по запросу заполнить внутренние структуры модели, а, когда они уже заполнены, переключиться на их использование, и вызвать reset()?

@Rcus Никогда не задумывался, т.к. с многопоточными приложениями не работал, но тоже интересно.
Записан
spectre71
Гость
« Ответ #8 : Июнь 22, 2009, 12:12 »

А если я подключусь после modelAboutToBeReset(), но до modelReset(), и начну к модели обращаться? Может стоит по запросу заполнить внутренние структуры модели, а, когда они уже заполнены, переключиться на их использование, и вызвать reset()?

@Rcus Никогда не задумывался, т.к. с многопоточными приложениями не работал, но тоже интересно.
Такие фокусы не проходят. Даже для изменения значения пременной типа указателя или int, которые используются в разный потоках используется блокировка. Поскольку в общем случае присваевание/чтение это не однотактовые операции и посреди оперции система может перключиться на другой поток, который к примеру попытается прочитать, то что находится на середине стадии присваивания Шокированный
Ну примерно так.
Возможно с однотактовостью я намудрил, а скорее несколько процессорных операций.
« Последнее редактирование: Июнь 22, 2009, 12:29 от spectre71 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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