Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
1

QGraphicsScene + QGraphicsView

04.03.2017, 17:21. Показов 3400. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чего я пытаюсь добиться. На сцене главный элемент - круг. Этот круг должен быть всегда виден целиком, иметь наибольший возможный радиус и располагаться в центре QGraphscsView *V.
Скроллбары мне не нужны и только мешают, я их отключаю
C++ (Qt)
1
2
 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
После создания V я строю сцену. Центром круга назначаю V->width()/2 V->height()/2, радиус - минимальный из них.
В круг помещаю разные итемы (пока без группировки), но с ними-то все в порядке.
Иногда перестраиваю всю сцену, делая S->clear().
И вот при измении размера виджета V (resizeEvent) а также при последующей перестройке начинается всякая ерунда.
В resizeEvent я вычисляю новый радиус и делаю scale(). На всякий случай запоминаю общее изменение маштаба в qreal scal
C++ (Qt)
1
2
3
4
5
  // Это в resizeEvent
  scale(....);
  centerOn(cent);  // cent - специально заведенный для этого маленький кружок
  S->setSceneRect(0, 0, V->width(), V->height());  // вариант
  setAlignment(Qt::AlignLeft | Qt::AlignTop); // вариант
При построении(перестроении) сцены в качестве радиуса выбирал, как и при первом построении, максимально возможный по геометрии QGraphscsView *V, так и умножал его на scal.
Перепробовал кучу вариантов и их композиций. А круг ведет себя кое-как.
То сдвигается от центра, то (при перестройке) становится очень большим и не влезает в виджет. В общем, никак не могу добиться выполнения своих условий
1. Круг всегда виден целиком
2. Имеет наибольший возможный радиус
3. Располагается в центре виджета.
Скажите, что я делаю не так, и есть ли еще какие-то рычаги влияния на эту непослушную сцену.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2017, 17:21
Ответы с готовыми решениями:

QGraphicsView + QGraphicsScene
#include <QApplication> #include <QGraphicsEllipseItem> #include <QGraphicsScene> #include...

QGraphicsView и QGraphicsScene
Здравствуйте! Подскажите, пожалуйста, в каких случаях удобнее наследоваться от QGraphicsView, а...

QGraphicsView and QGraphicsScene
При нажатии на левую клавишу мыши у меня должен получаться элипс, который рисуется на...

QGraphicsScene и QGraphicsView
У меня Qt 5.1.1. Компилируется, но ничего не отображается. Подскажите что не так... QGraphicsScene...

19
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
04.03.2017, 17:43 2
Байт, Можешь предоставить какой-нибудь тестовый код?
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
04.03.2017, 17:50  [ТС] 3
Цитата Сообщение от Wyn Посмотреть сообщение
Можешь предоставить какой-нибудь тестовый код?
Попробую, но не сразу. Проект довольно-таки объемный, вычленить из него относящееся к делу - тоже работа.
Да, забыл сказать, что все это на MDI, но не думаю, что это как-то влияет...
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
05.03.2017, 15:02  [ТС] 4
Вот. Удалось отбросить все, не имеющее к делу отношения.
Вложения
Тип файла: zip QU3.zip (41.4 Кб, 7 просмотров)
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
05.03.2017, 17:35 5
Лучший ответ Сообщение было отмечено Wyn как решение

Решение

Байт, почему бы не использовать QGraphicsView::fitInView?

Добавлено через 39 секунд
C++ (Qt)
1
2
3
4
void DView::resizeEvent(QResizeEvent *e)
{
    fitInView(cent, Qt::KeepAspectRatio);
}
2
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
05.03.2017, 17:48  [ТС] 6
Цитата Сообщение от Wyn Посмотреть сообщение
почему бы не использовать QGraphicsView::fitInView?
Спасибо! Буду пробовать. Мне этот метод попадался на глаза, но я как-то его не очень осмыслил. У него параметром прямоугольник или Итем, который он попытается плотно расположить в виджете, да?
В крайнем случае я ведь могу нарисовать невидимый квадрат, в который мой круг будет вписан, и ориентироваться по нему. Впрочем, и это не обязательно, этот квадрат легко извлечь из круга.
Копаем дальше!
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
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
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.03.2017, 15:19  [ТС] 8
Цитата Сообщение от Wyn Посмотреть сообщение
я же не просто метод упомянул, а прямо ссылку на него дал в документации
Не обращайте внимания на мои бормотания. Это просто мысли вслух.

Добавлено через 21 час 3 минуты
Но все равно ведет себя сцена кое-как...
Как поется в песне - "Нет, ребята, все не так."
Ладно. Еще немного подергаюсь и вернусь к старому доброму paintEvent

Добавлено через 14 минут
Из сценического функционала мне нужно только, чтобы помещенные в круг итемы по клику мышкой рассказывали кое-что о себе. Но это можно сделать и просто созданием списка кликабельных зон.
Впрочем, полностью надежды на сценический успех я не оставляю. В текущем варианте было нагорожено возможно излишнее количество всяких методов и флагов. Попробую все начать с чистого листа...

Добавлено через 7 минут
Кстати, вот фрагмент этой же документации на чистом русском
void QGraphicsView::fitInView (const QRectF & rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio )
Масштабирует матрицу вида и прокручивает полосы прокрутки чтобы обеспечить что прямоугольник сцены rect помещался в области просмотра. Прямоугольник rect должен быть внутри прямоугольника сцены; в противном случае fitInView() не может гарантировать что весь прямоугольник будет видимым.
Эта функция сохраняет поворот, трансляцию и обрезание вида. Вид масштабируется в соответствии с aspectRatioMode. Если прямоугольник rect не плотно размещается в виде, он будет центрирован.
Обычно fitInView() вызывают из переопределённой функции resizeEvent() чтобы обеспечить, чтобы вся сцена или её часть автоматически масштабировались для заполнения нового размера области просмотра, если вид меняет свой размер. Заметьте, что вызов fitInView() из resizeEvent() может привести к нежелательному рекурсивному изменению размера, если
новое преобразование переключает автоматическое состояние полос прокрутки. Чтобы предотвратить это, вы можете установить политику полос прокрутки равной "always on" или "always off"
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
06.03.2017, 16:25 9
Байт, pie-menu делаешь?
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.03.2017, 16:59  [ТС] 10
Цитата Сообщение от Wyn Посмотреть сообщение
Байт, pie-menu делаешь?
Что за зверь?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
06.03.2017, 17:18 11
Байт, круговое меню
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.03.2017, 17:42  [ТС] 12
Цитата Сообщение от Wyn Посмотреть сообщение
круговое меню
Нет, не совсем. Круг в самом деле Зодиакальный. Все - чистая лженаука. А на круге планетки нарисованы. И еще всякая ерунда. А нахождение планетки в определенном месте для моих юзеров-лжеученых что-то означает. И об этом можно рассказать. Аж книги толщенные по этому поводу пишут. Вот эти рассказики и являются частью проекта.
Понятно, что круг - всему голова, должен быть виден целиком, занимать почти все доступное место и не дергаться. А стрелочки, вызывающие его перестройку - это изменения момента времени, т.е. пересчет всех положений и ассоциаций.
Хотя с какой-то абстрактной точки зрения это и можно считать чем-то вроде pie-menu. Только не кругового, а слегка похитрее. Ну и еще там должны быть всякие мелкие виджетики-пояснялки. Вот им сценическое АПИ вовсе бы не помешало...
А для обычного рисования на QPainter через paintEvent основной скелет сделан и как-то работает. Но меня чего-то вдруг на сцену потянуло. Ежели не получится, слезы лить не буду. Все - опыт.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
09.03.2017, 17:40  [ТС] 13
С упорством, видимо достойным лучшего применения, я все-таки еще немножко подолбался с этой проблемой. Окончательно меня подкосило, что метод translate() делает совсем не то, что я от него ожидал. А именно - не делает вообще ничего. Выходом явилось просто перестроение сцены по ресайзу. Что почти свело на нет все приемущества работы со сценой.
Но по ходу этой возни удалось создать инструмент для всестороннего исследования проблемы, что-то вроде испытательного стенда. Может быть этот инструмент покажется кому-то интересным. А может быть интересен будет сам подход. Развитие и совершенствование Инструмента закончилось в тот момент, когда я свои исследования прекратил, придя к вышеупомянотому грустному выводу.
В пункте Metod я собирался нарисовать диалог, в котором задавался бы перечень методов, которые можно было бы применить. Чтобы не пересобирать программу после каждого чиха. Но до этого дело не дошло.
В принципе, каждый желающий может создать для себя нечто подобное. И если мои потуги принесут хоть кому-нибудь какую-то пользу, чтож, значит время потрачено не зря.
Вложения
Тип файла: zip QU3.ZIP (72.7 Кб, 4 просмотров)
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
15.03.2017, 15:31 14
Бегло набросал тут кое-чего. Не знаю, правильно ли я уловил постановку задачи, но...
Вложения
Тип файла: 7z untitled3.7z (4.3 Кб, 12 просмотров)
1
Диссидент
Эксперт C
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
Диссидент
Эксперт C
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
Чтобы не быть голословным - вот видео.
Вложения
Тип файла: 7z 123.7z (864.0 Кб, 9 просмотров)
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
16.03.2017, 12:25  [ТС] 20
Цитата Сообщение от Горбаг Посмотреть сообщение
Какая версия Qt?
Qt 4.5.2. Зато дллки 4.8.5 (так сложилось исторически)

Добавлено через 8 минут
На видео, да, все Ок.
Может быть, дело в версиях. А переходить не хочется. Есть причины.
И почему-то не работает qDebug().
Впрочем, Бог с ним!
Я уже остановился на варианте перестройки сцены по ресайзу. Как будто работает, и тормоза особого не наблюдается...
0
16.03.2017, 12:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2017, 12:25
Помогаю со студенческими работами здесь

Многопоточность и QGraphicsScene / QGraphicsView
Здравствуйте! Пишу небольшую игрушку чисто для себя (наподобие Space Race). Мой основной класс...

Масштабирование в QGraphicsView и QGraphicsScene
Есть у меня QGraphicsView MyLatticeGraphicsView. У него есть QGraphisScene Latscene. Масштабирую я...

Координаты QGraphicsView соотнести с QGraphicsScene
У меня есть QGraphicsView и QGraphicsScene. По mousePressEvent у View я создаю на Scene объект по...

Фон для QGraphicsScene и QGraphicsView
Создал класс от QGraphicsView для работы со сценой, хочу поставить на фон картинку, но ничего не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru