crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QGraphicsScene координаты
rp80
  опции профиля:
сообщение 10.9.2011, 13:07
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Два нубских вопроса. Сильно не бейте.

1. Как ограничить область рисования(по идее setSceneRect, но он ожидаемым образом не работает)
2. Как зафиксировать 0,0 в центре видимой области graphicsView.



вот код:
  
  mgw = MyGW::_self(this); //переопределенный graphView
    ui->setupUi(this);
    this->resize(400,400);// ресайз MainWindow
    ui->verticalLayout->addWidget(mgw);
    scene.setSceneRect(-200,-200,200,200);
    gi = scene.addText("AAss ASA");
    mgw->setScene(&scene);
    scene.setBackgroundBrush(QBrush(QColor("red")));

    QPen axisPen;
    axisPen.setColor(QColor("black"));
    axisPen.setWidth(5);
    scene.addLine(0,0,800,0,axisPen);

Ожидается: 0,0 в центре видимой части gView, область отрисовки квадрат со стороной 400 и красным фоном. Линия выходит из центра и обрезается на 200 пикселях справа.

В итоге имеем: точка 0,0 находится в правом нижнем углу видимой области graphView (288 пикселей от левого края, 87 от правого. 255 от верхнего, 55 от нижнего ), линия длиной все 800 пикселей, выходит за пределы видимой части view (можно увидеть меняя размер исходного окна).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 10.9.2011, 13:14
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


mgw->setAlignment(Qt::AlignCenter);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 10.9.2011, 13:19
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(RazrFalcon @ 10.9.2011, 14:14) *
mgw->setAlignment(Qt::AlignCenter);


Ничего не изменилось
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.9.2011, 21:31
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rp80 @ 10.9.2011, 16:07) *
Как ограничить область рисования
никак, только ограничивая сам процесс рисования. Т.к. сцена всегда, автоматически увеличивает свой размер, чтобы поместилось всё. Но никогда автоматически не уменьшает свой размер

rp80, что за привычка валить кучу вопросов в одной теме?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 10.9.2011, 23:21
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.9.2011, 22:31) *
Т.к. сцена всегда, автоматически увеличивает свой размер, чтобы поместилось всё. Но никогда автоматически не уменьшает свой размер

Зачем тогда нужен метод setSceneRect? Как он работает не могу понять.

Вот три примера:
1.
    mgw = MyGW::_self(this);
    ui->setupUi(this);
    this->resize(300,300);
    ui->verticalLayout->addWidget(mgw);

    scene.setSceneRect(-700,-700,700,700);

    mgw->setScene(&scene);
    scene.addLine(QLineF(mgw->mapToScene(0,0),mgw->mapToScene(100,0)),axisPen);

В этом случае у graphicsView появляются длинные скроллы и линия начинается не из левого верхнего угла graphicsView (как вообще ожидалось) а из точки в районе 80,200 в координатах graphicsView

2.
    mgw = MyGW::_self(this);
    ui->setupUi(this);
    this->resize(300,300);
    ui->verticalLayout->addWidget(mgw);

   scene.setSceneRect(-100,-100,100,100);

    mgw->setScene(&scene);
    scene.addLine(QLineF(mgw->mapToScene(0,0),mgw->mapToScene(100,0)),axisPen);

В этом случае у graphicsView скроллов нет и линия не видна совсем.

3.
    mgw = MyGW::_self(this);
    ui->setupUi(this);
    this->resize(300,300);
    ui->verticalLayout->addWidget(mgw);

   // scene.setSceneRect(-100,-100,100,100);

    mgw->setScene(&scene);
    scene.addLine(QLineF(mgw->mapToScene(0,0),mgw->mapToScene(100,0)),axisPen);

В этом случае линия начинается где надо, но у graphicsView скроллы.


Ну а нужно соответственно чтобы и объекты располагались нормально относительно внешних координат и чтобы не было ненужных скроллов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.9.2011, 8:21
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Когда рисуешь на сцене, нужно использовать координаты сцены, т.е. вместо
QLineF(mgw->mapToScene(0,0),mgw->mapToScene(100,0))
должно быть:
QLineF(QPoint(0,0), QPoint(100,0))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 11.9.2011, 10:13
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 11.9.2011, 9:21) *
Когда рисуешь на сцене, нужно использовать координаты сцены, т.е. вместо
QLineF(mgw->mapToScene(0,0),mgw->mapToScene(100,0))
должно быть:
QLineF(QPoint(0,0), QPoint(100,0))


Так я и рисую в координатах схемы. Перевожу точку 0,0 (верхний левый угол graphicsView) в координаты схемы и рисую из неё.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.9.2011, 17:19
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rp80 @ 11.9.2011, 13:13) *
Так я и рисую в координатах схемы.
нет. чтобы рисовать в координатах схемы нужно в её координатах и рисовать.
scene.addLine(QLineF(...), axisPen);
В этом коде нет никакого упоминания о представлении, сцена и только она. Поэтому посторонние объекты и не должны фигурировать.
А представление настрой так, чтобы оно отображало нужный кусок сцены.

То что ты делаешь напоминает езду на велосипеде попой вперёд
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 2:14