Исправлены наложения преобразования в QGraphicsView - PullRequest
3 голосов
/ 16 июня 2011

В приложении на основе Qt, которое я разрабатываю, я использую QGraphicsView для отображения данных датчика в 2D-сетке.На стороне я хотел бы показать легенду / палитру, чтобы связать цвета в сетке со значениями.

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

Однако я бы предпочел, чтобы палитра / легенда была реализована в виде неинтерактивного оверлейного слоя сэто очень собственная трансформация.Это как-то возможно?

Ответы [ 3 ]

2 голосов
/ 01 мая 2014

Вот действительно простой способ получить плавающую легенду (или и т. Д.), Я протестировал ее в Qt 4.8.5 и Qt 5.2.1:

  1. Подкласс QGraphicsView
  2. В вашем подклассе добавьте метод переопределения для метода drawForeground (QPainter *, const QRectF &)
  3. В вашем методе переопределения вызовите painter-> resetTransform () перед рисованием чего-либо
  4. Используйте QPainter, чтобы рисовать графику поверх вашего представления, так же, как и с любым другим QWidget

Это хорошо работает - в частности, при таком подходе вам не нужно вычислять какие-либо обратные преобразования координат или изменять режим обновления представления.

2 голосов
/ 22 июня 2011

Я думаю, вам следует реализовать наложение легенды / палитры вне контекста QGraphics, если вы переместите (setPosition ...) этого элемента, чтобы инвертировать пользовательское преобразование, которое вы добавляете, он будет повторно проиндексирован в графическом дереве в любое время, когда вы панорамирование / масштабирование ...

Выполнение наложенного виджета, безусловно, выполнимо, но в этом случае, поскольку это часть вашего графического контекста, я бы порекомендовал реализовать свой собственный QGraphicsView (wicth - это виджет), повторно реализовать paintEvent, чтобы нарисовать вашу палитру / легенда в пространстве виджетов по умолчанию (без преобразования). Плюс, если ваша палитра / легенда статична, вы можете визуализировать ее один раз в растровом изображении и просто перекрасить этот растровый растровый рисунок каждый раз, когда QGraphicsView требуется обновление (конечно, изменение размера потребует обновления буфера ...).

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

1 голос
/ 05 июля 2011

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

...