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->line1->setLine
)
【讨论】:
我想可能是这样。我曾经错误地定义了 boundingRect() 并且问题发生在缓慢变化的视图位置 - 项目没有正确绘制(它们进入场景的可见区域后没有重绘。这是因为 viewportUpdateMode 和默认值而发生的MinimalViewportUpdate - 仅在发生变化的地方重绘视口。【参考方案2】:除了错误的逻辑,在改变对象几何之前调用 QGraphicsItem::prepareGeometryChange()。这帮助我解决了类似的问题。
【讨论】:
以上是关于QGraphics查看工件的主要内容,如果未能解决你的问题,请参考以下文章
Qt - 使用 QTransform(或类似的),将内部 QRect 缩放到 QGraphics/从 QGraphics