QGraphicsView不会在滚动事件上重画

问题描述

| QT 4.7 我有一个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文档以及示例,但我不太清楚自己在做什么错。我假设这与坐标系有关。     

解决方法

一个推测:
paint
方法中的
QPainter
已经对其进行了转换,其中考虑了视口属性(比例,旋转等)。当您在绘画方法中调用
setTransform
时,您将全部消失。您可能想对现有转换执行矩阵运算,而不是创建一个新的矩阵运算。 因为您要在画家上调用
setClipRect
,然后尝试以完全不同的变换进行绘画,所以您在剪辑区域之外进行绘画,因此没有任何反应。 当您调整窗口大小或将窗口拖到屏幕外时,它可以工作,因为这会强制执行“重新绘制所有内容”,因此您的rect矩形将您的绘画区域包括在备用变换中。尽管我很惊讶它会出现在正确的位置。