Qt GraphicsScene: как создать новый слой? - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть QGraphicsView, отображается QGraphicsScene.Пользователь может масштабировать и панорамировать сцену с помощью кнопок.Эти операции реализуются с помощью функций QGraphicsView, таких как scale().Теперь я хочу нарисовать над ним несколько прозрачных растровых изображений, которые не должны преобразовываться действиями пользователя.Как я могу разместить их отдельно от graphicsView?

Ответы [ 3 ]

7 голосов
/ 16 ноября 2011

Если вы хотите, чтобы на QGraphicsView было что-то нарисовано полностью независимо от преобразования сцены, вы можете создать подкласс QGraphicsView и нарисовать эти элементы как часть (переопределенного) paintEventМетод.

void MyView::paintEvent(QPaintEvent *event) {
  // Call the base paintEvent to do the "normal" stuff.
  QGraphicsView::paintEvent(event);

  // Paint your other stuff. Note that you have to create the QPainter on 
  // the viewport.
  QPainter painter(viewport());
  painter.setBrush(QBrush(Qt::black));
  // ... etc.
}
2 голосов
/ 16 ноября 2011

Вы можете добавить флаг QGraphicsItem::ItemIgnoresTransformations к элементам растрового изображения, которые вы не хотите масштабировать.

Элемент игнорирует унаследованные преобразования (т. Е. Его позиция все еще привязана к его родительскому элементу, но преобразования вращения родительского элемента или представления, преобразования масштаба или сдвига игнорируются).Этот флаг полезен для хранения элементов текстовой метки в горизонтальном и немасштабированном виде, поэтому они все равно будут читаемыми, если представление преобразуется.Когда установлено, геометрия вида элемента и геометрия сцены будут поддерживаться отдельно.Вы должны вызвать deviceTransform (), чтобы отобразить координаты и обнаружить столкновения в представлении.По умолчанию этот флаг отключен.Этот флаг был введен в Qt 4.3.Примечание: с этим установленным флагом вы все еще можете масштабировать сам элемент, и это масштабное преобразование будет влиять на потомков элемента.

Используйте для этого функцию setFlag:

pixmapItem->setFlag(QGraphicsItem::ItemIgnoresTransformations);
0 голосов
/ 16 ноября 2011

Мне нравится ответ Дейва;для простого HUD это было бы хорошим способом.Однако вы можете сделать что-то подобное без создания подклассов и ручного рисования: просто создайте две сцены и два вида и поместите их друг на друга, например, в одно и то же место QGridLayout.Таким образом, у вас есть два совершенно независимых «слоя», как вы и хотели.

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