我正在Qt5中编写一个图像处理应用程序。图像是无限的16位色深,需要调整为8位才能显示。
在正常情况下,我会分析QGraphicsView
中当前可见的数据并创建动态地图以优化显示这些像素。每次视口以任何方式移动时都会执行此操作。此地图与QGraphicsView
。
我在此过程中已经QGraphicsScene
,QGraphicsView
和QGraphicsPixmapItem
进行了细分。
我的第一次尝试是在重新计算直方图时更新QGraphicsPixmapItem
的像素图,但这不起作用,因为QGraphicsPixmapItem
可能在多个视图中可见。 。无法正常访问视图。
我的第二次尝试是覆盖QGraphicPixmapItem
的{{1}}方法,该方法知道它正在绘制哪个视图,然后应用地图(类似于{{1}确实,除了在色彩空间之外)。但是,更新像素图会强制更新,因此在paint
方法中执行此操作会产生持续的绘制。
我的第三次尝试是将QTransform
功能从paint
中删除,并在绘画之前实现没有更新的版本,但当然它会访问我可以使用的私人成员。 t在子类中。
我可以预见的其余选项都是不可取的:
我是以完全错误的方式来做这件事的吗?是否有QT功能我没有使用?
答案 0 :(得分:3)
我可以建议以下方式。
不要使用QGraphicsPixmapItem
。它并不适合你的目标。创建QGraphicsItem
的子类并手动执行绘制。为项目启用QGraphicsItem::ItemUsesExtendedStyleOption
标记,以便传递给QStyleOptionGraphicsItem::exposedRect
方法的paint
为实际公开的矩形。将视图的viewportUpdateMode
设置为QGraphicsView::FullViewportUpdate
。每次移动滚动时,视图都将重新绘制所有视口,并调用可见图形项的paint
方法。在paint
方法实现中,您可以执行任何您希望的逻辑。例如,您可以构造新的QPixmap
对象(或更新现有对象)并使用QPainter::drawPixmap
绘制它。