QGraphics查看工件

Posted

技术标签:

【中文标题】QGraphics查看工件【英文标题】:QGraphicsView artefacts 【发布时间】:2012-03-25 12:04:45 【问题描述】:

我的 QGraphicsView 出现问题。我将 QGraphicsView 子类化以重新定义paintEvent。我想使用 QGraphicsItem 为节点绘制某种树,使用 QGraphicsLineItem 为边缘绘制某种树。

void GraphicsView::paintEvent ( QPaintEvent * event ) 
if(arbre!=NULL) 
    arbre->line1->setLine(arbre->text->x(),arbre->text->y(),
                          arbre->text1->x(),arbre->text1->y());

    QGraphicsView::paintEvent(event);
    cout << "redessine" << endl;

但是当我将节点快速移动时,视图上会出现一些伪影(黑线)。有什么建议可以摆脱这些吗?

【问题讨论】:

您解决问题的方法似乎有缺陷。通常,您将这条线添加到场景中并将场景设置为视图。你读过this吗? 你有背景设置吗? 【参考方案1】:

确保在您的QGraphics*Item 子类的boundingRect() 方法中包含一个边距。

http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#boundingRect

PS:不要将逻辑放在paintEvent 方法中。此方法用于渲染内容,而不是收集 UI 字段内容或其他任何内容 (arbre-&gt;line1-&gt;setLine)

【讨论】:

我想可能是这样。我曾经错误地定义了 boundingRect() 并且问题发生在缓慢变化的视图位置 - 项目没有正确绘制(它们进入场景的可见区域后没有重绘。这是因为 viewportUpdateMode 和默认值而发生的MinimalViewportUpdate - 仅在发生变化的地方重绘视口。【参考方案2】:

除了错误的逻辑,在改变对象几何之前调用 QGraphicsItem::​prepareGeometryChange()。这帮助我解决了类似的问题。

【讨论】:

以上是关于QGraphics查看工件的主要内容,如果未能解决你的问题,请参考以下文章

Qt QGraphics在中心查看一张背景图片

Qt - 使用 QTransform(或类似的),将内部 QRect 缩放到 QGraphics/从 QGraphics

Qt学习_QGraphics进阶学习笔记

Qt学习_QGraphics进阶学习笔记

最初在 QGraphics 中移动滚动条

从 QGraphicsScene 上的 QGraphicsLinearLayout 中删除 QGraphics 项