C++ QGraphicsView未在滚动时重新绘制事件

C++ QGraphicsView未在滚动时重新绘制事件,c++,qt,qt4,qgraphicsview,qgraphicsscene,C++,Qt,Qt4,Qgraphicsview,Qgraphicsscene,QT 4.7 我有一个QGraphicsView/qgraphicscene。场景有一个自定义的QGraphicsite。整个场景不是一次显示的,因此它有一个视口 我将覆盖QGraphicsItem的paint()方法,如下所示: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->setClip

QT 4.7

我有一个QGraphicsView/qgraphicscene。场景有一个自定义的QGraphicsite。整个场景不是一次显示的,因此它有一个视口

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

如果我调整窗口大小或将窗口拖离屏幕,然后再拖回到屏幕上,视图将刷新。我一直在看这些例子,但我不太明白我做错了什么。我假设这与坐标系有关。

猜测:

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

由于您正在对画师调用
setClipRect
,但随后尝试在完全不同的变换下进行绘制,因此您在clip rect之外进行绘制,并且没有发生任何事情

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

猜测:

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

由于您正在对画师调用
setClipRect
,但随后尝试在完全不同的变换下进行绘制,因此您在clip rect之外进行绘制,并且没有发生任何事情


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

你完全正确<代码>画师->设置变换(变换,真)修复了问题。您完全正确<代码>画师->设置变换(变换,真)修复了该问题。