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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Система координат в QGraphicsScene[РЕШЕНО]  (Прочитано 15246 раз)
Zeka13
Гость
« : Апрель 15, 2012, 00:10 »

Читал, читал, теорию понял, в практику так и не нашёл
Хочу в левом верхнем углу сцены нарисовать картинку квадратную, помогите пожалуйста...

  
Код
C++ (Qt)
QGraphicsScene *scene = new QGraphicsScene;
   QGraphicsPixmapItem* pPixmapItem =
       scene->addPixmap(QPixmap(":/images/plus.png"));
   pPixmapItem->setFlags(QGraphicsItem::ItemIsMovable);
  // что использовать за место 0,0(цент сцены вроде это получается) pPixmapItem->setPos(0,0);
  // или я совсем далеко от истины?
 
   ui->graphicsView->setScene(scene);
   ui->graphicsView->show();

заранее спасибо
« Последнее редактирование: Апрель 15, 2012, 16:05 от Zeka13 » Записан
iroln
Гость
« Ответ #1 : Апрель 15, 2012, 12:36 »

А размер сцены то изначально какой и где начало координат сцены? Если размер 0x0, то сцена будет расширяться динамически при таскании объектов по сцене. Если размер и начало координат заданы, например, setSceneRect(0, 0, 500, 500), то, чтобы вашу картинку поставить в левый верхний угол, надо задать позицию айтема в 0,0.
Записан
Zeka13
Гость
« Ответ #2 : Апрель 15, 2012, 13:38 »

спасибо за ответ, но что-то не совсем получается всё равно

в форме дизайнера выставил для окна с Graphics view(скомпонован по сетке) выставил размеры 500x500

сейчас код выглядит так

Код
C++ (Qt)
QGraphicsScene *scene = new QGraphicsScene;
   scene->setSceneRect(0, 0, 500, 500);
 
   QGraphicsPixmapItem* pPixmapItem =
       scene->addPixmap(QPixmap(":/images/plus.png"));
   pPixmapItem->setPos(500,500);
 
   QGraphicsPixmapItem* pPixmapItem2 =
       scene->addPixmap(QPixmap(":/images/minus.png"));
   pPixmapItem2->setPos(0,0);
 
   ui->graphicsView->setScene(scene);
   ui->graphicsView->show();

элемент в 500,500 совсем уезжает, а в 0,0 тоже немного съезжает, вот скрин

 
« Последнее редактирование: Апрель 15, 2012, 13:41 от Zeka13 » Записан
iroln
Гость
« Ответ #3 : Апрель 15, 2012, 14:18 »

Вот минимальный пример на Python:

Код
Python
import sys
 
from PySide.QtCore import Qt
 
from PySide.QtGui import (
   QApplication,
   QPen,
   QPixmap,
   QGraphicsView,
   QGraphicsScene,
   QGraphicsPixmapItem,
   QGraphicsRectItem,
)
 
if __name__ == '__main__':
 
   app = QApplication(sys.argv)
 
   view = QGraphicsView()
   scene = QGraphicsScene()
 
   pix_item_1 = QGraphicsPixmapItem()
   pix_item_1.setPixmap(QPixmap('image.png'))
 
   pix_item_2 = QGraphicsPixmapItem()
   pix_item_2.setPixmap(QPixmap('image.png'))    
 
   rect_item = QGraphicsRectItem()
 
   scene.setSceneRect(0.0, 0.0, 500.0, 500.0)
 
   scene.addItem(pix_item_1)
   scene.addItem(pix_item_2)
   scene.addItem(rect_item)
 
   pix_item_1.setPos(0, 0)
   pix_item_2.setPos(500, 500)
 
   rect_item.setRect(0, 0, 500, 500)
   rect_item.setPen(QPen(Qt.red, 2, Qt.SolidLine))
 
   view.setScene(scene)
   view.show()
 
   sys.exit(app.exec_())    
 

Результат работы в приложенной картинке.
Красная рамка - это границы сцены, две нарисованные кнопки - это два пиксмэп-айтема, одни с позицией 0,0, второй с позицией 500,500. Вся белая область, по сути всё окно - это QGraphicsView.

Ну, думаю, теперь будет понятнее, как оно работает.
« Последнее редактирование: Апрель 15, 2012, 14:20 от iroln » Записан
Zeka13
Гость
« Ответ #4 : Апрель 15, 2012, 14:22 »

я не могу из вашего примера понять, как мне изменить свой пример

python я не знаю
Записан
iroln
Гость
« Ответ #5 : Апрель 15, 2012, 14:28 »

Python знать не обязательно, API в PyQt такое же как в С++.

У вас скорее всего просто непонимание, как работает механизм графического представления. Со сценой у вас всё в порядке, элементы находятся там где нужно, но графический вид может отображать часть сцены и вообще смотреть в любую её точку, поэтому ваша айтем-картинка не находится в левом верхнем углу окна, но она по прежнему находится в верхнем левом углу сцены. То есть вид может изменять размеры, но сцена при этом не меняет своё положение, она зафиксирована в том положении, которые вы ей задали.
« Последнее редактирование: Апрель 15, 2012, 14:31 от iroln » Записан
Zeka13
Гость
« Ответ #6 : Апрель 15, 2012, 14:32 »

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


Записан
iroln
Гость
« Ответ #7 : Апрель 15, 2012, 14:43 »

Понятно, кажется, что у вас за проблема. Картинки же здоровенные. Вокруг вашего "минуса" огромная белая "рамка". Обрезать картинку не пробовали? Улыбающийся
Записан
Zeka13
Гость
« Ответ #8 : Апрель 15, 2012, 14:46 »

спасибо, сейчас попробую
Записан
iroln
Гость
« Ответ #9 : Апрель 15, 2012, 14:50 »

Вот, поправил. Посмотрите.
Записан
Zeka13
Гость
« Ответ #10 : Апрель 15, 2012, 15:04 »

спасибо огромное, но остаётся один вопрос

как сделать область(красный квадрат) на весь GraphicsView ?

Тобишь я разворачиваю окно на весь экран, а минус и плюс раскидываются в левый верхний и правый нижний иглы развёрнутого окна?
Записан
iroln
Гость
« Ответ #11 : Апрель 15, 2012, 15:55 »

Цитировать
Тобишь я разворачиваю окно на весь экран, а минус и плюс раскидываются в левый верхний и правый нижний иглы развёрнутого окна?
Ну по всей видимости при ресайзе окна пересчитывать размер сцены и позицию ваших картинок.

Как-то так, примерно. Посмотрите. Но можно придумать и другое решение.
Записан
Zeka13
Гость
« Ответ #12 : Апрель 15, 2012, 16:05 »

спасибо огромное ещё раз за потраченное на меня время, даже код за меня написали, сейчас буду разбираться!

Ваша реализация для меня полностью подходит!
Записан
iroln
Гость
« Ответ #13 : Апрель 15, 2012, 16:13 »

Да не за что. Просто вам, может быть было бы проще вообще без GraphicsScene обойтись, или в дальнейшем предполагается, что туда могут добавляться новые объекты с какими-то специфическими свойствами, поведением и т.д., а также интерактивное управление ими?
Записан
Zeka13
Гость
« Ответ #14 : Апрель 15, 2012, 18:02 »

не так сложно, но элементов будет много и они будут менять своё местоположение, так что QGraphicsScene для моей задачи оптимальное решение
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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