Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Morkonwen от Ноябрь 06, 2010, 13:27



Название: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Morkonwen от Ноябрь 06, 2010, 13:27
только начал изучать библиотеку, уже вижу, что она реализует за тебя очень и очень многие вещи, но не могу разобраться в следующем

как бы я ни менял setSceneRect , реальная область отображения упорно включает в себя нарисованные линии

Причем я могу сделать облатсь видимоти больше, чем нужна для включения линий, но не меньше.(полос прокрутки вообще не появляется)

Код:
qte2::qte2(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);

scene=new mainscene();

connect(ui.pushButton, SIGNAL(clicked()), SLOT(ButtonCl()));

ui.graphicsView->setScene(scene);
ui.graphicsView->setSceneRect(QRectF(3,5,7,7))    ;



}


void qte2::ButtonCl( void )
{


liniya=scene->addLine(1,1,20,20);

scene->addLine(100,100,120,120);



}


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: marbius от Ноябрь 06, 2010, 13:43
QGraphicsView::sceneRect содержит область сцены, которую визуализирует QGrapphicsView

QGraphicsScene::sceneRect содержит область, ограничивающую объекты сцены. Эта область может (автоматически) расширяться при добавлении/перемещении объектов сцены, но никогда не сжимается

как-то так...

а у Вас какая задача-то?


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Morkonwen от Ноябрь 06, 2010, 13:48
просто нарисовать кусочек сцены!
заметте я меняю
QGraphicsView::sceneRect ! очень странно


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Sancho_s_rancho от Ноябрь 06, 2010, 13:53
просто нарисовать кусочек сцены!
заметте я меняю
QGraphicsView::sceneRect ! очень странно
void QGraphicsView::centerOn() + void QGraphicsView::fitInView();


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Morkonwen от Ноябрь 07, 2010, 00:13

Цитировать
void QGraphicsView::centerOn() + void QGraphicsView::fitInView();

Спасибо, так получше, но все равно область отображения ведет себя каким то неоднозначным и неочевидным образом. Может надо какуюто загадочную настройку класса поменять, что бы он не "делал как лучше"?


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Sancho_s_rancho от Ноябрь 07, 2010, 16:30

Цитировать
void QGraphicsView::centerOn() + void QGraphicsView::fitInView();

Спасибо, так получше, но все равно область отображения ведет себя каким то неоднозначным и неочевидным образом. Может надо какуюто загадочную настройку класса поменять, что бы он не "делал как лучше"?
Я не эксперт QGraphicsView, но в своей программе я поступаю следующим образом
0) Отключаю в QGraphicsView скроллбары
1) Устанавливаю границы сцены по ее содержимому. Далее их не трогаю.
    scene->setSceneRect(scene->itemsBoundingRect());
2) Делаю QGraphicsView::fitInView с этими границами. И для ResizeEvent тоже пишу fitInView.
3) Если мне надо увеличить какой-либо Item, то делаю fitInView() и эти же цифирьки сохраняются для ResizeEvent . Это делается для того, чтобы пользователь, увеличивая окно, получил увеличенный Item.

Как-то так. Ежели вы всерьез хотите разобраться, то рекомендую книгу http://www.amazon.com/Advanced-Qt-Programming-Creating-Development/dp/0321635906 Там достаточно подробно описываются правила игры с QGraphicsView framework.
Пи.си. Книга на английском, но достаточно легком.


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Morkonwen от Ноябрь 07, 2010, 18:07
спасибо, уже качаю!

Кстати все равно в восторге от qt вся графика моей программы заняла 20 строк, когда на windows form это было порядка 100!


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Morkonwen от Ноябрь 08, 2010, 18:28
Такоей вопрос еще возник, Есть картинка с огромным количеством линий(как бы лист в клетку) по полю перемещается кружок. Для его перемещения использую QGraphicsItem::translate. проблема в том, что кружок на предидущем месте иногда не затирается. как быть?


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Morkonwen от Ноябрь 08, 2010, 19:05
Все разобрался помогла только установка режима полной перерисовки.

setViewportUpdateMode(QGraphicsView::FullViewportUpdate);


 Никакие "умные" и "по прямоугольникам" режимы не помогли

а если задний фон не по линиям прорисовывать а сделать периодической картиной клеток будет лучше?


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Sancho_s_rancho от Ноябрь 08, 2010, 20:08
Такоей вопрос еще возник, Есть картинка с огромным количеством линий(как бы лист в клетку) по полю перемещается кружок. Для его перемещения использую QGraphicsItem::translate. проблема в том, что кружок на предидущем месте иногда не затирается. как быть?
А почему вы так не делаете:

Код:
QGraphicsItem *ball = new QGraphicsEllipseItem(0, 0, 20, 20);

     QTimeLine *timer = new QTimeLine(5000);
     timer->setFrameRange(0, 100);

     QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
     animation->setItem(ball);
     animation->setTimeLine(timer);

     for (int i = 0; i < 200; ++i)
         animation->setPosAt(i / 200.0, QPointF(i, i));

     QGraphicsScene *scene = new QGraphicsScene();
     scene->setSceneRect(0, 0, 250, 250);
     scene->addItem(ball);

     QGraphicsView *view = new QGraphicsView(scene);
     view->show();

     timer->start();


Название: Re: Простейшая вещь завела в тупик(sceneRect)
Отправлено: Morkonwen от Ноябрь 08, 2010, 22:52
Такоей вопрос еще возник, Есть картинка с огромным количеством линий(как бы лист в клетку) по полю перемещается кружок. Для его перемещения использую QGraphicsItem::translate. проблема в том, что кружок на предидущем месте иногда не затирается. как быть?
А почему вы так не делаете:

Код:
QGraphicsItem *ball = new QGraphicsEllipseItem(0, 0, 20, 20);

     QTimeLine *timer = new QTimeLine(5000);
     timer->setFrameRange(0, 100);

     QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
     animation->setItem(ball);
     animation->setTimeLine(timer);

     for (int i = 0; i < 200; ++i)
         animation->setPosAt(i / 200.0, QPointF(i, i));

     QGraphicsScene *scene = new QGraphicsScene();
     scene->setSceneRect(0, 0, 250, 250);
     scene->addItem(ball);

     QGraphicsView *view = new QGraphicsView(scene);
     view->show();

     timer->start();
Ух ты, спасибо, сейчас сделаю все красиво=)

пс важно, что анимации и таймер должны существовать глобально, например в куче, а еще я не учел, что i меняется до 199 и i/200!=1 никогда.

А так все классно работает)