2011-05-25 218 views
1

QT 4.7QGraphicsView滚动事件不刷新

我有一个QGraphicsView/QGraphicsScene。场景有一个自定义的QGraphicsItem,整个场景不会一次显示,所以它有一个视口。

我重写我的QGraphicsItem的paint()方法如下:

void paint(QPainter *painter, 
      const QStyleOptionGraphicsItem *option, 
      QWidget *widget) 
{ 
    painter->setClipRect(option->exposedRect); 
    painter->save(); 

    // Default identity matrix 
    QTransform transform; 

    // Apply some transform later 

    // The next line breaks stuff 
    painter->setTransform(transform); 

    // m_image is just a preloaded pixmap (i.e. watermark on all of these items). 
    painter->drawImage(QPoint(0,0), this->m_image); 
    painter->restore(); 

    // Snip, do more drawing... 
} 

如果我曾经尝试在QPainter的一个setTransform(即,如果我想要旋转的项目),视图停止重绘场景,作为对用于平移的水平或垂直滚动​​条的响应。当我放大或缩小时,视图也会停止调整场景的大小。

如果我调整窗口大小或将窗口拖出屏幕然后返回屏幕,视图将刷新。我一直在查看QPainter Documentation以及示例,我无法弄清楚我做错了什么。我假设这与坐标系有关。

回答

1

猜测:

这涉及到你的paint方法上已经有一个转换,考虑到视口的属性(缩放,旋转等)的QPainter。当你在paint方法中调用setTransform时,你正在吹走所有的东西。您可能想要对现有变换执行矩阵操作,而不是创建新操作。

既然你打电话给你的画家setClipRect,但然后试图在一个完全不同的变换下绘画,你是在你的剪辑之外绘画,没有任何事情发生。

它可以在您调整窗口大小或将窗口拖出屏幕时起作用,因为这将强制“重绘所有内容”,因此剪辑矩形会将您的绘画区域包括在替代变换中。虽然我很惊讶它会出现在正确的位置。

+0

你是绝对正确的。 'painter-> setTransform(transform,true);'解决了这个问题。 – LeviX 2011-05-26 18:45:18