Russian Qt Forum
Ноябрь 23, 2024, 07:49
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
[Решено]Вызов setPos() из paint() графических элементов. Можно?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: [Решено]Вызов setPos() из paint() графических элементов. Можно? (Прочитано 5931 раз)
DarkHobbit
Самовар
Offline
Сообщений: 197
[Решено]Вызов setPos() из paint() графических элементов. Можно?
«
:
Январь 02, 2014, 14:45 »
Добрый день.
Допустимо ли вызывать метод QGraphicsItem::setPos из метода paint() наследников этого самого QGraphicsItem? Мне перед отображением элемента надо рассчитать, где он будет выводиться, исходя из масштаба физических величин к ширине отображаемой области. А ширину эту, как я понимаю, я могу взять только из painter-а.
В предыдущей версии своего кода я совсем не пользовался setPos, отрисовывал все элементы в координатах сцены, размеры сцены брал из QPainter::viewport(), и всё, в общем-то, замечательно отрисовывалось. Но теперь мне понадобилось к некоторым элементам добавить перетаскивание, причём перетаскивание не совсем автоматическое - оно разрешено только по одной координате, и при этом надо ещё пересчитывать физическую величину. Первое, что пришлось сделать - это отказаться от координат сцены, иначе проблемы будут уже в boundingRect(). Теперь отрисовку я делаю в координатах самого элемента, а в начале paint() вызываю setPos, рассчитанный исходя из размера отображаемой области. В общем-то, отображение самого элемента работает. Но возникают странные артефакты, например, в процессе расширения окна другие элементы (другого класса, на который действие моего setPos не распространяется) могут исчезать и появляться обратно.
Проблема повторена на Qt 4.6 и 4.8.4, причём мне показалось, что на 4.8.4 глюки были реже, но совсем не исчезли.
Компактный кусок кода, который исчерпывающе иллюстрировал бы проблему, я постараюсь собрать, но сделать это будет нелегко: как-то слишком всё у меня пока размазано. Но может, он и не нужен? Если я действительно пытаюсь сделать то, чего в Qt в принципе делать нельзя - буду искать другие пути. Поэтому буду благодарен, если для начала кто-либо знающий ответит на "теоретический" вопрос, сформулированный в названии темы...
«
Последнее редактирование: Март 08, 2014, 12:14 от DarkHobbit
»
Записан
Мои проекты на Qt:
DoubleContact
,
LInvert
DarkHobbit
Самовар
Offline
Сообщений: 197
Re: Вызов setPos() из paint() графических элементов. Можно?
«
Ответ #1 :
Январь 02, 2014, 15:01 »
Просто в примерах я действительно не видел, чтобы setPos вызывался напрямую в paint().
Если же это в принципе не криминал - разумеется, придётся сделать "программу из трёх строк", повторяющую эффект.
Записан
Мои проекты на Qt:
DoubleContact
,
LInvert
Bepec
Гость
Re: Вызов setPos() из paint() графических элементов. Можно?
«
Ответ #2 :
Январь 02, 2014, 15:11 »
Это не особо хорошо из-за системы отрисовки Qt.
К сожалению я не работал глубоко с GraphicItem, но вы если вы не учитывается все моменты, то можете просто свалиться в рекурсию, или же как раз возникнет перекрытие областей (пропадение других итемов) и многое другое.
PS я бы не рекомендовал. Но сделать можно всё ^.^
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Вызов setPos() из paint() графических элементов. Можно?
«
Ответ #3 :
Январь 02, 2014, 15:23 »
Это не должно работать корректно. Если какой-то айтем вызовет немедленное обновление (repaint) получим бесконечный рекурс. И даже если нет, то по окончании рисования виджет становится "валидным", т.е. ОС считает его полностью перерисованным, запрос на обновление (вызванный setPos) потерян.
Не может такого быть что какой-то нужный параметр доступен только в painter. Установка позиции должна проводиться отдельно (напр сразу как отпущена мыша) и с рисованием не пересекаться.
Записан
DarkHobbit
Самовар
Offline
Сообщений: 197
Re: Вызов setPos() из paint() графических элементов. Можно?
«
Ответ #4 :
Январь 02, 2014, 18:57 »
Цитата: Igors от Январь 02, 2014, 15:23
Это не должно работать корректно.
Цитата: Bepec от Январь 02, 2014, 15:11
если вы не учитывается все моменты, то можете просто свалиться в рекурсию, или же как раз возникнет перекрытие областей (пропадение других итемов) и многое другое.
Спасибо, это я и хотел услышать.
Цитата: Igors от Январь 02, 2014, 15:23
Не может такого быть что какой-то нужный параметр доступен только в painter.
Нужный параметр - это, по большому счёту, ширина отрисовываемой области. (Возможно, в будущем понадобится и высота.)
Я ещё немного поэкспериментировал - в принципе, childrenRect() у QGraphicsView возвращает ту же самую ширину, что и viewport() у QPainter.
Наверное, я перекрою QGraphicsView::resizeEvent() и буду делать setPos дочерним элементам в нём. (Ну а для драг-н-дропа вызову обновление отдельно.) Это будет корректно?
Записан
Мои проекты на Qt:
DoubleContact
,
LInvert
Fregloin
Супер
Offline
Сообщений: 1025
Re: Вызов setPos() из paint() графических элементов. Можно?
«
Ответ #5 :
Январь 02, 2014, 20:37 »
Масштаб физических величин лучше всего вызывать в функции boundingRect или shape. В них же можно делать и другие перерасчеты но нежелательно.
Как я делал, в предке объявил виртуальную функцию recalculate(), и ее вызываю совместно с prepareGeometryChanges.
Записан
DarkHobbit
Самовар
Offline
Сообщений: 197
Re: [Решено]Вызов setPos() из paint() графических элементов. Можно?
«
Ответ #6 :
Март 08, 2014, 12:17 »
Всем спасибо за ответы. В общем-то, проблема была в том, что я пытался рисовать элементы в координатах сцены. После того, как я начал в paint() использовать координаты самого элемента, а setPos() вызывать извне, необходимость дёргать его из функции отрисовки пропала (по крайней мере, извне).
Записан
Мои проекты на Qt:
DoubleContact
,
LInvert
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...