Название: QGraphicsScene ещё вопрос Отправлено: k2rush от Декабрь 14, 2012, 15:48 Здравствуйте.
Имеется необходимость создания сцены в шириной в 60 000 (30000 - 90000), и высотой в 100. Но полоски прокрутки быть не должно, всё должно быть смасштабированно в узкое окно, с функцией выбора масштаба, хочу поставлю всю ширину, хочу только 500 пикселей. А на этой сцене должны быть отрисованы элементы, без масштабирования, то есть, кружочки и цветочки имеют свои 10 пикселей в любом варианте, просто плотность разная визуально получается. Поискав на форуме и в книгах, нашёл функцию fitInView(ui->graphicsView->scene()->sceneRect()). Но видимо у нас разные понятия о влезании в размер и получаается вот что(первый скрин до использования функции, второй после): (http://www.fotolink.su/pic_s/b2599bd515fedc15f2ee6f217f0ffe7a.jpg) 643x711(10.10 kB) (http://www.fotolink.su/v.php?id=b2599bd515fedc15f2ee6f217f0ffe7a) хостинг картинок (http://www.fotolink.su) (http://www.fotolink.su/pic_s/07446d3dea50294ccd09b3a5864ca605.jpg) 650x717(9.00 kB) (http://www.fotolink.su/v.php?id=07446d3dea50294ccd09b3a5864ca605) хостинг картинок (http://www.fotolink.su) Так же были различные эксперименты с масштабированием вручную, но тогда и Item-ы так же уменьшались(их я создаю QGraphicsRectItem *rect; rect = scene->addRect(pointX, pointY, 5,5); Устанавливал флаг ::ItemIgnoresTransformations, но при установки масштаба сцены, они в неё просто не умешались, то есть(видимо) рисовались в пределах 90000 пикселей без перемещения. Такие дела Название: Re: QGraphicsScene в QGraphicsView Отправлено: Bepec от Декабрь 14, 2012, 17:55 Проще выражаясь вам нужно отобразить или всё, или малый участок. Что вам мешает отрисовывать только "нужные" участки, а остальное хранить в виде данных? да и проведение оптимизации поможет, когда необходимо будет отрисовывать допустим 500 квадратов на одной координате. Вместо 500, рисовать 1 с жырными границами. Или просто 1.
Правда тут уже нужны алгоритмы, коих я незнаю :D Название: Re: QGraphicsScene в QGraphicsView Отправлено: k2rush от Декабрь 14, 2012, 18:12 расчёт видимого участка и его отрисовка это тема, да и вроди ничего там не нужно особенного, просто проверять границы, а дальше уже масштаб сцены и пересчёт местанахождения итемов для псевдо-широкой сцены(на самом деле она 600 пикселей). Но заниматься такими костылями, я хотел бы только убедившись, что библиотичных решений нет =\
Название: Re: QGraphicsScene в QGraphicsView Отправлено: Bepec от Декабрь 14, 2012, 18:48 Помоему это у вас немного эээ...
60000 ширина - нафига? Берём среднестатические 1920x1080 (мой :) ). и пропорционально уменьшаем сцену. Получаем на максимуме 4000 (возьмём в 2 раза больше на всяк случай). Соответственно расчёт упрощается. PS к сожалению не моё конёк. Что мог то сказал. Название: Re: QGraphicsScene в QGraphicsView Отправлено: k2rush от Декабрь 14, 2012, 18:57 Спасибо =)
такая ширина, ибо это будет уменьшенное подобие карты, и мышью когда по ней придётся водить, он будет отслеживать ширину, а уменьшить...Штука то в том что уменьшать нужно только по оси абсцисс, а ось ординат, всегда константная - 100. Название: Re: QGraphicsScene в QGraphicsView Отправлено: Dancing_on_water от Декабрь 14, 2012, 19:06 В GraphicsView запрещаем прокрутку, затем юзаем sceneRect с зумом item-ов
Название: Re: QGraphicsScene в QGraphicsView Отправлено: k2rush от Декабрь 14, 2012, 19:26 Не совсем понял идею, в SceneRect указываем нужную ширину? То есть допустим 10000. А что потом делать с "зумом" iten-ов? на ширине 10000 их быть может 200, а GraphcsView у нас всё равно отображает ширину только в 600 пикселей.
В общем я ничего не понял =( Название: Re: QGraphicsScene в QGraphicsView Отправлено: Dancing_on_water от Декабрь 14, 2012, 20:11 Попытаюсь по-подробнее.
В QGraphics есть несколько размеров: размер viewport - грубо говоря размер отображаемого холста. (на его размер мы можем влиять косвенно, сообщение о его измении qgraphicsview получает через viewportEvent) полный размер сцены - высчитывается автоматически из расположения item-ов и есть sceneRect - отображаемый прямоугольник. Его желаемый размер можно выставить через setSceneRect (почему, желаемый - потомучто, есть еще размер viewPort) В простейшем случае у тебя будет окно постоянной геометрии, тебе надо будет менять его положение. (К, примеру, отслеживая положения мыши).. Изменение масштаба делается просто: создается parentItem, который подцепляется к сцене. Для вся остальных item-ов, он назначается родителем. А потом parentItem->setScale() и вуаля, мы изменили масштаб Название: Re: QGraphicsScene в QGraphicsView Отправлено: k2rush от Декабрь 14, 2012, 21:07 Ого, не могу сказать, что сейчас я до конца всё понял, но не спеши отчаиваться =)
Код: scene->setSceneRect(QRectF(MIN_X, 0, MAX_X, 100)); (http://www.fotolink.su/pic_s/1ca99c13942ece2b854fdf2d512b5ae3.jpg) 848x604(17.33 kB) (http://www.fotolink.su/v.php?id=1ca99c13942ece2b854fdf2d512b5ae3) Ведь мы не просто двигаем нашу сцену, мы её масштабируем. А если просто двигать её, то получится то что на рисунке, при MIN_X =1000 MAX_X =2000. Масштабирование элемента это я понял, а вот что с самой сценой? Почему собственно у меня некорректно работает fitInSize() ? Или то что на скрине в ппервом посте и есть нормальная работа? Название: Re: QGraphicsScene в QGraphicsView Отправлено: Dancing_on_water от Декабрь 14, 2012, 21:24 Я уже сказал, что есть три размер:
полный размер сцены (мы его задать не можем) Есть размер холста -viewport. Его размер задается через геометирю, виджета. Но qt может зарубить попытки увеличить его размераю И есть размер отображаемой сцены. Естественно, он должен быть не больше холста и за этим следит qt. Что ты сейчас пытаешь сделать: отобразить огроменное окно на малом холсте. Естественно, твою попытку рубят Название: Re: QGraphicsScene в QGraphicsView Отправлено: GreatSnake от Декабрь 15, 2012, 11:54 А на этой сцене должны быть отрисованы элементы, без масштабирования, то есть, кружочки и цветочки имеют свои 10 пикселей в любом варианте, просто плотность разная визуально получается. Имхо, такое поведение противоречит модели QGraphicsScene, т.к. геометрия элемента задаётся на сцене, а масштабирование на QGraphicsView.Т.е. менять плотность через масштабирование стандартными средствами никак не получится. Название: Re: QGraphicsScene в QGraphicsView Отправлено: k2rush от Декабрь 15, 2012, 17:49 Тогда ещё вопрос, надеюсь сюда кто нибуть заглянет.
Тратятся ли ресурсы, на поддержание item-ов которые выхходят за сцену и не видимы в принципе? Если я буду иметь на каждый итем по таймеру, а их будет 200-300, будет ли это фатальным для работоспособности? Название: Re: QGraphicsScene ещё вопрос Отправлено: Bepec от Декабрь 15, 2012, 18:11 это же View. Нет не будут они отрисовываться. А в памяти останутся.
|