QGraphicsView未在滚动事件上重新绘制

QGraphicsView not repainting on scroll event

本文关键字:新绘制 绘制 滚动 事件 QGraphicsView      更新时间:2023-10-16

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上设置Transform(即,如果我试图旋转项目),视图将停止重新绘制场景,以响应用于平移的水平或垂直滚动条。当我放大或缩小时,视图也会停止调整场景的大小。

如果我调整窗口大小或将窗口拖离屏幕,然后再拖回屏幕,视图将刷新。我一直在查看QPainter文档以及示例,但我不太清楚自己做错了什么。我认为这与坐标系有关。

猜测:

paint方法中的QPainter已经有一个考虑到视口属性(比例、旋转等)的变换。当您在绘制方法中调用setTransform时,您正在消除所有这些。您可能希望对现有变换执行矩阵运算,而不是创建新的变换。

由于您在画家上调用setClipRect,但随后尝试在完全不同的变换下进行绘制,因此您在剪辑矩形之外进行绘制,但没有发生任何事情。

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