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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Особенность отрисовки  (Прочитано 3294 раз)
UVV
Гость
« : Ноябрь 24, 2009, 12:14 »

Есть вот такая штука http://qt.nokia.com/developer/task-tracker/index_html?method=entry&id=232227
В кратце, если внутри функции отрисовки виджета вызвать ещё что-нибудь, требующее отрисовки (Statusbar, MessageBox), то в винде получаем segfault, а в линуксе просто предупреждения валятся в консоль QPaintEngine::setSystemRect: Should not be changed while engine is active.

Так вот, у меня есть модель и есть treeview. Когда treeview нужно перерисоваться, он вызывает в свою очередь model::data().
В data() я проверяю, все ли элементы модели прошли нужную обработку. Если обработка не пройдена (например, нужно что-то распарсить), то её нужно сделать перед отображением. Так вот если в результате обработки возникает какая-либо ошибка, то её нужно отобразить в MessageBox'e. Тут и возникает ситуация, которую я описал выше.
Что лучше сделать в этом случае? Переделать архитектуру приложения или есть другие пути?
Записан
Rcus
Гость
« Ответ #1 : Ноябрь 24, 2009, 12:34 »

Если нужно просто уведомить об ошибке то можно использовать QTimer::singleShot(0,..) и отдавать QVariant::Invalid
Записан
UVV
Гость
« Ответ #2 : Ноябрь 24, 2009, 17:51 »

Если нужно просто уведомить об ошибке то можно использовать QTimer::singleShot(0,..) и отдавать QVariant::Invalid

А что можно сделать ещё? )

По поводу таймера, я так понял, что он отработает после прорисовки, так? Значит нужно следить, чтобы все переменные, которые нужны для уведомления, оставались валидными..
Записан
UVV
Гость
« Ответ #3 : Ноябрь 24, 2009, 18:32 »

Если нужно просто уведомить об ошибке то можно использовать QTimer::singleShot(0,..) и отдавать QVariant::Invalid
Да, и всё же с таймером это получается workaround. Что вообще лучше сделать (может даже в архитектуре приложения) чтобы избежать таких случаев?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 24, 2009, 19:49 »

Так вот, у меня есть модель и есть treeview. Когда treeview нужно перерисоваться, он вызывает в свою очередь model::data().
В data() я проверяю, все ли элементы модели прошли нужную обработку. Если обработка не пройдена (например, нужно что-то распарсить), то её нужно сделать перед отображением. Так вот если в результате обработки возникает какая-либо ошибка, то её нужно отобразить в MessageBox'e. Тут и возникает ситуация, которую я описал выше.
Что лучше сделать в этом случае? Переделать архитектуру приложения или есть другие пути?
Прерывать процесс рисования нельзя. Варианты

1) Рисовать ошибку - напр. красное ERROR в ячейке

2) Испустить сигнал паренту, connect должен быть создан с флагом Qt::QueuedConnection (т.е. послать в очередь событий а не переться сразу с MessageBox)

А лучше 1 и 2 вместе Улыбающийся

OT: ну почему UVV, а не UVW или просто UV?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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