Название: Особенность отрисовки Отправлено: 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? |