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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Простейшая вещь завела в тупик(sceneRect)  (Прочитано 9478 раз)
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);



}
« Последнее редактирование: Ноябрь 06, 2010, 13:30 от Morkonwen » Записан
marbius
Гость
« Ответ #1 : Ноябрь 06, 2010, 13:43 »

QGraphicsView::sceneRect содержит область сцены, которую визуализирует QGrapphicsView

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

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

а у Вас какая задача-то?
Записан
Morkonwen
Гость
« Ответ #2 : Ноябрь 06, 2010, 13:48 »

просто нарисовать кусочек сцены!
заметте я меняю
QGraphicsView::sceneRect ! очень странно
Записан
Sancho_s_rancho
Гость
« Ответ #3 : Ноябрь 06, 2010, 13:53 »

просто нарисовать кусочек сцены!
заметте я меняю
QGraphicsView::sceneRect ! очень странно
void QGraphicsView::centerOn() + void QGraphicsView::fitInView();
« Последнее редактирование: Ноябрь 06, 2010, 14:00 от Sancho_s_rancho » Записан
Morkonwen
Гость
« Ответ #4 : Ноябрь 07, 2010, 00:13 »


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

Спасибо, так получше, но все равно область отображения ведет себя каким то неоднозначным и неочевидным образом. Может надо какуюто загадочную настройку класса поменять, что бы он не "делал как лучше"?
Записан
Sancho_s_rancho
Гость
« Ответ #5 : Ноябрь 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.
Пи.си. Книга на английском, но достаточно легком.
Записан
Morkonwen
Гость
« Ответ #6 : Ноябрь 07, 2010, 18:07 »

спасибо, уже качаю!

Кстати все равно в восторге от qt вся графика моей программы заняла 20 строк, когда на windows form это было порядка 100!
Записан
Morkonwen
Гость
« Ответ #7 : Ноябрь 08, 2010, 18:28 »

Такоей вопрос еще возник, Есть картинка с огромным количеством линий(как бы лист в клетку) по полю перемещается кружок. Для его перемещения использую QGraphicsItem::translate. проблема в том, что кружок на предидущем месте иногда не затирается. как быть?
Записан
Morkonwen
Гость
« Ответ #8 : Ноябрь 08, 2010, 19:05 »

Все разобрался помогла только установка режима полной перерисовки.

setViewportUpdateMode(QGraphicsView::FullViewportUpdate);


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

а если задний фон не по линиям прорисовывать а сделать периодической картиной клеток будет лучше?
Записан
Sancho_s_rancho
Гость
« Ответ #9 : Ноябрь 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();
Записан
Morkonwen
Гость
« Ответ #10 : Ноябрь 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 никогда.

А так все классно работает)
« Последнее редактирование: Ноябрь 08, 2010, 23:36 от Morkonwen » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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