根据显示的QGraphicsView绘制QGraphicsItem

时间:2014-05-09 10:55:53

标签: qt image-processing qgraphicsview qgraphicsitem

我正在Qt5中编写一个图像处理应用程序。图像是无限的16位色深,需要调整为8位才能显示。

在正常情况下,我会分析QGraphicsView中当前可见的数据并创建动态地图以优化显示这些像素。每次视口以任何方式移动时都会执行此操作。此地图与QGraphicsView

相关联

我在此过程中已经QGraphicsSceneQGraphicsViewQGraphicsPixmapItem进行了细分。

我的第一次尝试是在重新计算直方图时更新QGraphicsPixmapItem的像素图,但这不起作用,因为QGraphicsPixmapItem可能在多个视图中可见。 。无法正常访问视图。

我的第二次尝试是覆盖QGraphicPixmapItem的{​​{1}}方法,该方法知道它正在绘制哪个视图,然后应用地图(类似于{{1}确实,除了在色彩空间之外)。但是,更新像素图会强制更新,因此在paint方法中执行此操作会产生持续的绘制。

我的第三次尝试是将QTransform功能从paint中删除,并在绘画之前实现没有更新的版本,但当然它会访问我可以使用的私人成员。 t在子类中。

我可以预见的其余选项都是不可取的:

  1. 修改QT,以便QTransform支持colarspace操作(太多工作,我真的想要库存QT)
  2. 复制QGraphicsPixmapItem的代码而不是对其进行子类化,并使其按照我想要的方式工作(可能是许可证问题)
  3. 假设我只获得了一个视图并且只是在某个地方破解它。
  4. 我是以完全错误的方式来做这件事的吗?是否有QT功能我没有使用?

1 个答案:

答案 0 :(得分:3)

我可以建议以下方式。

不要使用QGraphicsPixmapItem。它并不适合你的目标。创建QGraphicsItem的子类并手动执行绘制。为项目启用QGraphicsItem::ItemUsesExtendedStyleOption标记,以便传递给QStyleOptionGraphicsItem::exposedRect方法的paint为实际公开的矩形。将视图的viewportUpdateMode设置为QGraphicsView::FullViewportUpdate。每次移动滚动时,视图都将重新绘制所有视口,并调用可见图形项的paint方法。在paint方法实现中,您可以执行任何您希望的逻辑。例如,您可以构造新的QPixmap对象(或更新现有对象)并使用QPainter::drawPixmap绘制它。