c++ - QGraphicsView 不在滚动事件上重新绘制

标签 c++ qt qt4 qgraphicsview qgraphicsscene

QT 4.7

我有一个 QGraphicsView/QGraphicsScene。场景有一个自定义的 QGraphicsItem 整个场景不是一次显示,所以它有一个视口(viewport)。

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

如果我调整窗口大小或将窗口拖到屏幕外然后再回到屏幕上, View 将刷新。我一直在查看 QPainter Documentation以及示例,我不太清楚自己做错了什么。我假设它与坐标系有关。

最佳答案

一个猜测:

您的paint 方法中的QPainter 已经有一个转换,它考虑了视口(viewport)属性(缩放、旋转等)。当您在您的绘画方法中调用 setTransform 时,您会把所有这些都吹走。您可能希望对现有转换执行矩阵运算,而不是创建新转换。

由于您正在对您的 painter 调用 setClipRect 但随后尝试在完全不同的变换下进行绘画,因此您在 clip rect 之外进行绘画并且没有任何反应。

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

关于c++ - QGraphicsView 不在滚动事件上重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6131687/

相关文章:

c++ - Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?

macos - 在 OS X 上的 QT4 中启用 OpenGL 核心配置文件

c++ - 正在使用的文件 C/C++

c++ - 在 solaris 上创建和使用动态共享库

linux - 在 Qt Creator 中设置 ARM 工具链(Ardupilot 项目)

c++ - 如何在 Qt 中创建旋转立方体效果?

c++ - 使用 QPushButton 向 QTextEdit 添加文本

c++ - 覆盖 QMessageBox::paintEvent()

c++ - 如果要求比较器是严格的全排序而不仅仅是严格的弱排序,C++ 标准算法会更快吗?

java - 如何在 java 中执行 map[u].push_back(v) (c++)?