Russian Qt Forum
Ноябрь 24, 2024, 03:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsScene ещё вопрос  (Прочитано 7983 раз)
k2rush
Гость
« : Декабрь 14, 2012, 15:48 »

Здравствуйте.
Имеется необходимость создания сцены в шириной в 60 000 (30000 - 90000), и высотой в 100. Но полоски прокрутки быть не должно, всё должно быть смасштабированно в узкое окно, с функцией выбора масштаба, хочу поставлю всю ширину, хочу только 500 пикселей. А на этой сцене должны быть отрисованы элементы, без масштабирования, то есть, кружочки и цветочки имеют свои 10 пикселей в любом варианте, просто плотность разная визуально получается.
Поискав на форуме и в книгах, нашёл функцию fitInView(ui->graphicsView->scene()->sceneRect()).
Но видимо у нас разные понятия о влезании в размер и получаается вот что(первый скрин до использования функции, второй после):


643x711(10.10 kB)

хостинг картинок


650x717(9.00 kB)

хостинг картинок

Так же были различные эксперименты с масштабированием вручную, но тогда и Item-ы так же уменьшались(их я создаю QGraphicsRectItem *rect; rect = scene->addRect(pointX, pointY, 5,5);
Устанавливал флаг ::ItemIgnoresTransformations, но при установки масштаба сцены, они в неё просто не умешались, то есть(видимо) рисовались в пределах 90000 пикселей без перемещения.
Такие дела
« Последнее редактирование: Декабрь 15, 2012, 17:51 от k2rush » Записан
Bepec
Гость
« Ответ #1 : Декабрь 14, 2012, 17:55 »

Проще выражаясь вам нужно отобразить или всё, или малый участок. Что вам мешает отрисовывать только "нужные" участки, а остальное хранить в виде данных? да и проведение оптимизации поможет, когда необходимо будет отрисовывать допустим 500 квадратов на одной координате. Вместо 500, рисовать 1 с жырными границами. Или просто 1.

Правда тут уже нужны алгоритмы, коих я незнаю Веселый
Записан
k2rush
Гость
« Ответ #2 : Декабрь 14, 2012, 18:12 »

расчёт видимого участка и его отрисовка это тема, да и вроди ничего там не нужно особенного, просто проверять границы, а дальше уже масштаб сцены и пересчёт местанахождения итемов для псевдо-широкой сцены(на самом деле она 600 пикселей). Но заниматься такими костылями, я хотел бы только убедившись, что библиотичных решений нет =\
Записан
Bepec
Гость
« Ответ #3 : Декабрь 14, 2012, 18:48 »

Помоему это у вас немного эээ...

60000 ширина - нафига?
Берём среднестатические 1920x1080 (мой Улыбающийся ). и пропорционально уменьшаем сцену. Получаем на максимуме 4000 (возьмём в 2 раза больше на всяк случай).
Соответственно расчёт упрощается.

PS к сожалению не моё конёк. Что мог то сказал.
Записан
k2rush
Гость
« Ответ #4 : Декабрь 14, 2012, 18:57 »

Спасибо =)
такая ширина, ибо это будет уменьшенное подобие карты, и мышью когда по ней придётся водить, он будет отслеживать ширину, а уменьшить...Штука то в том что уменьшать нужно только по оси абсцисс, а ось ординат, всегда константная - 100.
Записан
Dancing_on_water
Гость
« Ответ #5 : Декабрь 14, 2012, 19:06 »

В GraphicsView запрещаем прокрутку, затем юзаем sceneRect с зумом item-ов
Записан
k2rush
Гость
« Ответ #6 : Декабрь 14, 2012, 19:26 »

Не совсем понял идею, в SceneRect указываем нужную ширину? То есть допустим 10000. А что потом делать с "зумом" iten-ов? на ширине 10000 их быть может 200, а GraphcsView у нас всё равно отображает ширину только в 600 пикселей.
В общем я ничего не понял =(
Записан
Dancing_on_water
Гость
« Ответ #7 : Декабрь 14, 2012, 20:11 »

Попытаюсь по-подробнее.
В QGraphics есть несколько размеров:
размер viewport - грубо говоря размер отображаемого холста. (на его размер мы можем влиять косвенно, сообщение о его измении qgraphicsview получает через viewportEvent)
полный размер сцены - высчитывается автоматически из расположения item-ов
и есть sceneRect - отображаемый прямоугольник. Его желаемый размер можно выставить через setSceneRect (почему, желаемый - потомучто, есть еще размер viewPort)


В простейшем случае у тебя будет окно постоянной геометрии, тебе надо будет менять его положение. (К, примеру, отслеживая положения мыши)..
Изменение масштаба делается просто: создается parentItem, который подцепляется к сцене. Для вся остальных item-ов, он назначается родителем.
А потом parentItem->setScale() и вуаля, мы изменили масштаб
Записан
k2rush
Гость
« Ответ #8 : Декабрь 14, 2012, 21:07 »

Ого, не могу сказать, что сейчас я до конца всё понял, но не спеши отчаиваться =)
Код:
    scene->setSceneRect(QRectF(MIN_X, 0, MAX_X, 100));
    ui->graphicsView->setFixedSize(640,640);
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  


848x604(17.33 kB)

Ведь мы не просто двигаем нашу сцену, мы её масштабируем. А если просто двигать её, то получится то что на рисунке, при MIN_X =1000 MAX_X =2000. Масштабирование элемента это я понял, а вот что с самой сценой?

Почему собственно у меня некорректно работает fitInSize() ? Или то что на скрине в ппервом посте и есть нормальная работа?
« Последнее редактирование: Декабрь 14, 2012, 21:13 от k2rush » Записан
Dancing_on_water
Гость
« Ответ #9 : Декабрь 14, 2012, 21:24 »

Я уже сказал, что есть три размер:
полный размер сцены (мы его задать не можем)
Есть размер холста -viewport. Его размер задается через геометирю, виджета. Но qt может зарубить попытки увеличить его размераю
И есть размер отображаемой сцены. Естественно, он должен быть не больше холста и за этим следит qt.

Что ты сейчас пытаешь сделать: отобразить огроменное окно на малом холсте. Естественно, твою попытку рубят
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Декабрь 15, 2012, 11:54 »

А на этой сцене должны быть отрисованы элементы, без масштабирования, то есть, кружочки и цветочки имеют свои 10 пикселей в любом варианте, просто плотность разная визуально получается.
Имхо, такое поведение противоречит модели QGraphicsScene, т.к. геометрия элемента задаётся на сцене, а масштабирование на QGraphicsView.
Т.е. менять плотность через масштабирование стандартными средствами никак не получится.
Записан

Qt 5.11/4.8.7 (X11/Win)
k2rush
Гость
« Ответ #11 : Декабрь 15, 2012, 17:49 »

Тогда ещё вопрос, надеюсь сюда кто нибуть заглянет.
Тратятся ли ресурсы, на поддержание item-ов которые выхходят за сцену и не видимы в принципе? Если я буду иметь на каждый итем по таймеру, а их будет 200-300, будет ли это фатальным для работоспособности?
Записан
Bepec
Гость
« Ответ #12 : Декабрь 15, 2012, 18:11 »

это же View. Нет не будут они отрисовываться. А в памяти останутся.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 23.