QGraphicsView未在滚动事件上重新绘制
QGraphicsView not repainting on scroll event
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
,但随后尝试在完全不同的变换下进行绘制,因此您在剪辑矩形之外进行绘制,但没有发生任何事情。
当你调整窗口大小或将其拖离屏幕时,它会起作用,因为这会强制"重新绘制所有内容",所以你的剪辑矩形会将你的绘画区域包括在你的替代变换中。虽然我很惊讶它会出现在正确的位置。
相关文章:
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- SFML 文本未绘制在窗口上
- 如何在快板的屏幕中显示子位图的绘制?
- 如何绘制自定义形状的元素?
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- C++ WinApi 绘制图像.jpg到新窗口
- 如何获取绘制点的新坐标
- 如果新图像中的原始像素为黑色,则Qt绘制一个蓝色像素
- 在 OpenGL 中每帧绘制新的全屏图像的最快方法是什么?
- MFC在最大化窗口处绘制新窗口
- 如何编辑SFML源代码来添加一个新的可绘制对象