QPainter 在使用 QPropertyAnimation 时崩溃

Posted

技术标签:

【中文标题】QPainter 在使用 QPropertyAnimation 时崩溃【英文标题】:QPainter crashes while using the QPropertyAnimation 【发布时间】:2019-04-09 16:21:00 【问题描述】:

我想将 propertyAnimation 中的 graphicsOpacityEffect 用于包含带有像素图标签的 QFrame。我的代码是:

eff = QGraphicsOpacityEffect(frame)
widget.setGraphicsEffect(eff)            

animation = QPropertyAnimation(eff, b"opacity")
animation.setStartValue(0)
animation.setEndValue(1)
animation.setDuration(500)
animation.setEasingCurve(QEasingCurve.InBack)
animation.start(QPropertyAnimation.DeleteWhenStopped)

一切正常,但是当我将标签悬停时,图像消失,我收到如下警告:

QPainter::setWorldTransform: Painter not active
QPainter::setWorldTransform: Painter not active
QPainter::begin: A paint device can only be painted by one painter at a time.
QPainter::translate: Painter not active
QPainter::worldTransform: Painter not active
QWidgetEffectSourcePrivate::pixmap: Painter not active
QPainter::worldTransform: Painter not active
QPainter::setWorldTransform: Painter not active
QPainter::setWorldTransform: Painter not active
QPainter::begin: A paint device can only be painted by one painter at a time.

【问题讨论】:

请提供minimal reproducible example 什么是小部件? Widget 可以是任何 QWidget。在这种情况下,它是 QFrame。 【参考方案1】:

在将新的 QGraphicsOpacityEffect 分配给小部件或其子级之前,您应该删除之前为小部件设置的 QGraphicsOpacityEffect,如下所示:

connect(animation,&QPropertyAnimation::finished,[=]()
           eff->deleteLater();
);

正如错误所说:

QPainter::begin:一个绘画设备一次只能由一个画家绘画。

有两个或多个画家试图同时绘制小部件。

背景:

QGraphicsEffectQGraphicsOpacityEffect 的基类,适用于 Qt 中的任何图形效果库。如果您查看 QGraphicsEffect 源代码,它使用 QPainter 进行绘图。因此,用户在任何小部件上使用任何图形效果类都意味着他正在启动一个 QPainter 来渲染效果,很明显我们不能一次使用多个 QPainter 进行绘制设备或表面。

【讨论】:

以上是关于QPainter 在使用 QPropertyAnimation 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QPainter 在 QOpenGLWidget 中进行叠加 [关闭]

如何在Qgraphicsview上使用QPainter绘图

QPainter 在使用 QPropertyAnimation 时崩溃

使用 QPainter 的动画文本

使用 QPainter 绘图

如何在 QML Canvas 对象中检索 QPainter 对象