Перемещение QPixmap в угол QGraphicsScene - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть QGraphicsView и QGraphicsScene, связанные следующим образом:

graphicsScene->setSceneRect(this->graphicsView->rect());
graphicsView->setScene(this->Scene);

Затем я загружаю изображение и добавляю его в сцену:

  QPixmap pixmap;
  pixmap.load(fileName);

  pixmap = pixmap.scaled(this->graphicsView->size());
  QGraphicsPixmapItem* item = this->Scene->addPixmap(pixmap);

Теперь, как описано вдокументация, угол изображения в (0,0), который не является углом graphicsScene.Я знаю, что могу расположить полученное растровое изображение, выполнив:

item->setPos(this->Scene->sceneRect().x(), this->Scene->sceneRect().y());

Однако я не могу понять смысл координат прямоугольника сцены или вида.Может кто-нибудь объяснить, как я переместил бы растровое изображение в угол сцены / представления?

Спасибо,

Дэвид

РЕДАКТИРОВАТЬ: Вот полный конструктор формы.QGraphicsView был создан в Qt Designer и находится внутри GridLayout:

Form::Form(QWidget *parent)
    : QWidget(parent)
{
  setupUi(this);

  QGraphicsScene* scene = new QGraphicsScene;
  scene->setSceneRect(this->graphicsView->rect());
  this->graphicsView->setScene(scene);

  QPixmap pixmap;
  pixmap.load("image.png");
  pixmap = pixmap.scaled(this->graphicsView->size());

  scene->addPixmap(pixmap);

}

Я также пробовал это:

  QGraphicsScene* scene = new QGraphicsScene;
  this->graphicsView->setScene(scene);

  QPixmap pixmap;
  pixmap.load("/home/doriad/glasses.jpg");

  QGraphicsPixmapItem * item = scene->addPixmap(pixmap);
  this->graphicsView->fitInView (item);

, но изображение выглядит крошечным, а не заполняет вид какЯ бы ожидал.Кто-нибудь может объяснить это?

Полный проект и изображение доступны здесь: daviddoria.com/Uploads/qt/QPixmapPosition

Ответы [ 4 ]

0 голосов
/ 05 ноября 2011

Оказывается, проблема в том, что GraphicsView был в макете.В моем примере изменение размера изображения было сделано в конструкторе Form.Видимо это до того, как макет обретет свою форму?Я переместил код в pushButton, и когда я щелкнул по нему, размер изображения соответствовал моим ожиданиям.

Я получил размер изображения в соответствии с GraphicsView в Layout, создав подкласс QGraphicsView и переопределив:

class CustomGraphicsView: public QGraphicsView
{
  Q_OBJECT
    {
          void resizeEvent ( QResizeEvent * event )
          {
            emit resized();
          }

        signals:
          void resized();
    }

Затем я подключаю этот сигнал resized () к слоту, который просто вызывает this->View->fitInView (this->ImageToTraceItem);

David

0 голосов
/ 05 ноября 2011

Попробуйте это:

QGraphicsScene* scene = new QGraphicsScene;
scene->setSceneRect(graphicsView->sceneRect());
QPixmap pixmap;
pixmap.load("/home/doriad/glasses.jpg");
pixmap=pixmap.scaledToWidth(this->graphicsView->width());
QGraphicsPixmapItem * item = scene->addPixmap(pixmap);
graphicsView->setScene(scene);

По умолчанию растровое изображение будет в точке (0,0), а сцена - в точке (0,0).QWidget имеет размеры в пикселях.Если у вас был QGraphicsView, размер экрана и разрешение 1440 x 900, вы можете расположить объекты в этом виде от (0,0) или верхнего левого угла экрана до (1440,900) нижнего правого углаэкрана.Большинство QGraphicsItems размещаются со ссылкой на их верхний левый угол.Таким образом, размещение растрового изображения в точке (0,0) выравнивает верхний левый угол растрового изображения с верхним левым углом сцены, в которой оно размещено. Если ваше растровое изображение «висит внизу» вашего представления, попробуйте использовать:

pixmap=pixmap.scaledToHeight(this->graphicsView->height());

Если вы используете функцию:

this->graphicsView->fitInView (item);

GraphicsView будет прокручивать только до точки, где ваш элемент вписывается в представление.

0 голосов
/ 05 ноября 2011

Я скачал код Дэвида и запустил его двумя способами.Нажмите на ссылки, чтобы увидеть результаты.

1) с pixmap = pixmap.scaledToHeight (this-> graphicsView-> height ());

2) с pixmap = pixmap.scaledToHeight (200);

Я не знаю достаточно, чтобы объяснить, почему это происходит, но я подумал, что это будет полезная точка данных.

0 голосов
/ 04 ноября 2011

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

Используйте graphicsView->fitInView(pixmap);, но вы должны прочитать документацию для:

Qt's Framework View Graphics

void QGraphicsView::setSceneRect (QRectF )

void QGraphicsView::translate ( qreal dx, qreal dy )

void QGraphicsView::fitInView ( const QGraphicsItem * item, ... )

Способ взаимодействия QGraphicsScene и QGraphicsView заключается в том, что у вас может быть одна сцена с как минимум одним или несколькими представлениями.

Хороший пример, который мне нравится вспоминать, - это увеличенное изображение части карты с мини-изображением всей карты в углу. Есть два вида, один из части карты и один из всей карты, с одной сценой, сама карта.

Таким образом, вы помещаете предметы в свою сцену, и все предметы в сцене рисуются относительно друг друга по размеру. «Прямоугольник сцены» вашего вида по умолчанию масштабируется, чтобы соответствовать элементам в представлении до тех пор, пока одна единица в сцене не станет одним пикселем в представлении или до тех пор, пока ему не потребуется уменьшить масштаб, чтобы соответствовать всем элементам в вашей сцене.

Если вы вызываете fitInView (someItem), он должен масштабировать ваш вид сцены так, чтобы указанный элемент заполнил его и переместил вид так, чтобы он был центрирован. Если вам нужно перевести или масштабировать больше, используйте функции translate или scale в QGraphicsView.

Когда вы перемещаетесь между системами координат вашей сцены и просмотра с помощью QRect или QPoint, используйте вспомогательные функции: mapToScene и mapFromScene из QGraphicsView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...