QGraphicsView不重新绘制滚动事件

时间:2011-05-25 22:24:53

标签: c++ qt qt4 qgraphicsview qgraphicsscene

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

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

1 个答案:

答案 0 :(得分:1)

猜测:

来自QPainter方法的paint已经对其进行了转换,其中考虑了视口属性(比例,旋转等)。当你在绘画方法中调用setTransform时,你就会把它吹走。您可能希望对现有转换执行矩阵运算,而不是创建新转换。

既然你在画家身上调用了setClipRect,然后尝试在一个完全不同的变换下进行绘画,那么你就是在剪辑矩形之外画画,没有任何事情发生。

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