开发者

QGraphicsView not repainting on scroll event

开发者 https://www.devze.com 2023-03-08 05:17 出处:网络
QT 4.7 I have a QGraphicsView / QGraphicsScene. The scene has a custom QGrap开发者_StackOverflow社区hicsItem the whole scene is not displayed at one time, so it has a viewport.

QT 4.7

I have a QGraphicsView / QGraphicsScene. The scene has a custom QGrap开发者_StackOverflow社区hicsItem the whole scene is not displayed at one time, so it has a viewport.

I'm overriding the paint() method of my QGraphicsItem as follows:

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...
}

If I ever try to setTransform on the QPainter (i.e. if I'm trying to rotate the item), the view stops repainting the scene as a response to the horizontal or vertical scrollbars used to pan. The view also stops resizing the scene when I zoom in or zoom out.

The view will refresh if I resize the window or drag the window offscreen and then back onscreen. I've been looking over the QPainter Documentation as well as the examples and I can't quite figure out what I'm doing wrong. I'm assuming it's something to do with the coordinate system.


A guess:

The QPainter that comes to your paint method already has a transform on it that takes into account the viewport attributes (scale, rotation, etc.). When you call setTransform within your paint method you are blowing all that away. You probably want to perform a matrix operation on the existing transform rather than creating a new one.

Since you are calling setClipRect on your painter but then trying to paint under a completely different transform, you are painting outside your clip rect and nothing is happening.

It works when you resize or drag the window off screen because that forces a "redraw everything," so your clip rect includes your painting area in your alternate transform. Although I'm surprised it would appear in the correct location.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号