Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: UVV от Ноябрь 24, 2009, 12:14



Название: Особенность отрисовки
Отправлено: 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. Тут и возникает ситуация, которую я описал выше.
Что лучше сделать в этом случае? Переделать архитектуру приложения или есть другие пути?


Название: Re: Особенность отрисовки
Отправлено: Rcus от Ноябрь 24, 2009, 12:34
Если нужно просто уведомить об ошибке то можно использовать QTimer::singleShot(0,..) и отдавать QVariant::Invalid


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

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

По поводу таймера, я так понял, что он отработает после прорисовки, так? Значит нужно следить, чтобы все переменные, которые нужны для уведомления, оставались валидными..


Название: Re: Особенность отрисовки
Отправлено: UVV от Ноябрь 24, 2009, 18:32
Если нужно просто уведомить об ошибке то можно использовать QTimer::singleShot(0,..) и отдавать QVariant::Invalid
Да, и всё же с таймером это получается workaround. Что вообще лучше сделать (может даже в архитектуре приложения) чтобы избежать таких случаев?


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

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

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

А лучше 1 и 2 вместе :)

OT: ну почему UVV, а не UVW или просто UV?