Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|||||||||||
1 | |||||||||||
QGraphicsScene + QGraphicsView04.03.2017, 17:21. Показов 3400. Ответов 19
Метки нет (Все метки)
Чего я пытаюсь добиться. На сцене главный элемент - круг. Этот круг должен быть всегда виден целиком, иметь наибольший возможный радиус и располагаться в центре QGraphscsView *V.
Скроллбары мне не нужны и только мешают, я их отключаю
В круг помещаю разные итемы (пока без группировки), но с ними-то все в порядке. Иногда перестраиваю всю сцену, делая S->clear(). И вот при измении размера виджета V (resizeEvent) а также при последующей перестройке начинается всякая ерунда. В resizeEvent я вычисляю новый радиус и делаю scale(). На всякий случай запоминаю общее изменение маштаба в qreal scal
Перепробовал кучу вариантов и их композиций. А круг ведет себя кое-как. То сдвигается от центра, то (при перестройке) становится очень большим и не влезает в виджет. В общем, никак не могу добиться выполнения своих условий 1. Круг всегда виден целиком 2. Имеет наибольший возможный радиус 3. Располагается в центре виджета. Скажите, что я делаю не так, и есть ли еще какие-то рычаги влияния на эту непослушную сцену.
0
|
04.03.2017, 17:21 | |
Ответы с готовыми решениями:
19
QGraphicsView + QGraphicsScene QGraphicsView и QGraphicsScene QGraphicsView and QGraphicsScene QGraphicsScene и QGraphicsView |
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
04.03.2017, 17:50 [ТС] | 3 |
Попробую, но не сразу. Проект довольно-таки объемный, вычленить из него относящееся к делу - тоже работа.
Да, забыл сказать, что все это на MDI, но не думаю, что это как-то влияет...
0
|
05.03.2017, 17:35 | 5 | |||||
Сообщение было отмечено Wyn как решение
Решение
Байт, почему бы не использовать
QGraphicsView::fitInView ?Добавлено через 39 секунд
2
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
05.03.2017, 17:48 [ТС] | 6 |
Спасибо! Буду пробовать. Мне этот метод попадался на глаза, но я как-то его не очень осмыслил. У него параметром прямоугольник или Итем, который он попытается плотно расположить в виджете, да?
В крайнем случае я ведь могу нарисовать невидимый квадрат, в который мой круг будет вписан, и ориентироваться по нему. Впрочем, и это не обязательно, этот квадрат легко извлечь из круга. Копаем дальше!
0
|
05.03.2017, 17:53 | 7 |
Байт, я же не просто метод упомянул, а прямо ссылку на него дал в документации. Там всё написано. Другие варианты данного метода можно просмотреть чуть пролистав страницу вверх. Рад был помочь.
Добавлено через 3 минуты Байт, Вообще это очень полезная функция. Она обеспечивает, что определённая часть координат сцены всегда видна. И, кстати, было абсолютно правильным отключить scrolls. http://doc.qt.io/qt-5/qgraphicsview.html#fitInView It's common to call fitInView() from inside a reimplementation of resizeEvent(), to ensure that the whole scene, or parts of the scene, scales automatically to fit the new size of the viewport as the view is resized. Note though, that calling fitInView() from inside resizeEvent() can lead to unwanted resize recursion, if the new transformation toggles the automatic state of the scrollbars. You can toggle the scrollbar policies to always on or always off to prevent this (see horizontalScrollBarPolicy() and verticalScrollBarPolicy()).
1
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
06.03.2017, 15:19 [ТС] | 8 |
Не обращайте внимания на мои бормотания. Это просто мысли вслух.
Добавлено через 21 час 3 минуты Но все равно ведет себя сцена кое-как... Как поется в песне - "Нет, ребята, все не так." Ладно. Еще немного подергаюсь и вернусь к старому доброму paintEvent Добавлено через 14 минут Из сценического функционала мне нужно только, чтобы помещенные в круг итемы по клику мышкой рассказывали кое-что о себе. Но это можно сделать и просто созданием списка кликабельных зон. Впрочем, полностью надежды на сценический успех я не оставляю. В текущем варианте было нагорожено возможно излишнее количество всяких методов и флагов. Попробую все начать с чистого листа... Добавлено через 7 минут Кстати, вот фрагмент этой же документации на чистом русском
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
06.03.2017, 17:42 [ТС] | 12 |
Нет, не совсем. Круг в самом деле Зодиакальный. Все - чистая лженаука. А на круге планетки нарисованы. И еще всякая ерунда. А нахождение планетки в определенном месте для моих юзеров-лжеученых что-то означает. И об этом можно рассказать. Аж книги толщенные по этому поводу пишут. Вот эти рассказики и являются частью проекта.
Понятно, что круг - всему голова, должен быть виден целиком, занимать почти все доступное место и не дергаться. А стрелочки, вызывающие его перестройку - это изменения момента времени, т.е. пересчет всех положений и ассоциаций. Хотя с какой-то абстрактной точки зрения это и можно считать чем-то вроде pie-menu. Только не кругового, а слегка похитрее. Ну и еще там должны быть всякие мелкие виджетики-пояснялки. Вот им сценическое АПИ вовсе бы не помешало... А для обычного рисования на QPainter через paintEvent основной скелет сделан и как-то работает. Но меня чего-то вдруг на сцену потянуло. Ежели не получится, слезы лить не буду. Все - опыт.
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
09.03.2017, 17:40 [ТС] | 13 |
С упорством, видимо достойным лучшего применения, я все-таки еще немножко подолбался с этой проблемой. Окончательно меня подкосило, что метод translate() делает совсем не то, что я от него ожидал. А именно - не делает вообще ничего. Выходом явилось просто перестроение сцены по ресайзу. Что почти свело на нет все приемущества работы со сценой.
Но по ходу этой возни удалось создать инструмент для всестороннего исследования проблемы, что-то вроде испытательного стенда. Может быть этот инструмент покажется кому-то интересным. А может быть интересен будет сам подход. Развитие и совершенствование Инструмента закончилось в тот момент, когда я свои исследования прекратил, придя к вышеупомянотому грустному выводу. В пункте Metod я собирался нарисовать диалог, в котором задавался бы перечень методов, которые можно было бы применить. Чтобы не пересобирать программу после каждого чиха. Но до этого дело не дошло. В принципе, каждый желающий может создать для себя нечто подобное. И если мои потуги принесут хоть кому-нибудь какую-то пользу, чтож, значит время потрачено не зря.
0
|
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
|
|
15.03.2017, 15:31 | 14 |
Бегло набросал тут кое-чего. Не знаю, правильно ли я уловил постановку задачи, но...
1
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
15.03.2017, 20:29 [ТС] | 15 |
Горбаг, спасибо!
Но у меня не понимает Q_NULLPTR - Это просто NULL или 0, да? и Q_DECL_OVERRIDE - видимо, можно просто опустить? Добавлено через 2 часа 2 минуты С этой фигней разобрался. Пример работает. Буду смотреть...
0
|
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
|
|
15.03.2017, 20:43 | 16 |
Сообщи, как проверишь.
1
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
15.03.2017, 22:25 [ТС] | 17 |
Да, непременно!
Но на первый взгляд - немножко не то. Простейший вариант. Я его, кажется, уже проходил. А может быть и не проходил. Сразу стал усложнять. А все сила, может быть, в простоте. Вот сразу. При запуске видна только четвертушка круга. Но надо, конечно, покрутить, всякие qDebug поставить и прочие контрольные точки. В общем, поработаю, не торопясь. Дам, по возможности, подробный отчет.
0
|
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
|
|
16.03.2017, 09:45 | 18 |
Ну как же так? У меня-то все прекрасно работает.
Хотя вспоминаю про непонятки с NULLPTR и q_DECL_OVERRIDE и это мне уже не кажется таким уж невозможным. Какая версия Qt?
1
|
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
|
|
16.03.2017, 09:50 | 19 |
Чтобы не быть голословным - вот видео.
1
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
16.03.2017, 12:25 [ТС] | 20 |
Qt 4.5.2. Зато дллки 4.8.5 (так сложилось исторически)
Добавлено через 8 минут На видео, да, все Ок. Может быть, дело в версиях. А переходить не хочется. Есть причины. И почему-то не работает qDebug(). Впрочем, Бог с ним! Я уже остановился на варианте перестройки сцены по ресайзу. Как будто работает, и тормоза особого не наблюдается...
0
|
16.03.2017, 12:25 | |
16.03.2017, 12:25 | |
Помогаю со студенческими работами здесь
20
Многопоточность и QGraphicsScene / QGraphicsView Масштабирование в QGraphicsView и QGraphicsScene Координаты QGraphicsView соотнести с QGraphicsScene Фон для QGraphicsScene и QGraphicsView Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |