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:一个绘画设备一次只能由一个画家绘画。
有两个或多个画家试图同时绘制小部件。
背景:
QGraphicsEffect 是 QGraphicsOpacityEffect 的基类,适用于 Qt 中的任何图形效果库。如果您查看 QGraphicsEffect 源代码,它使用 QPainter 进行绘图。因此,用户在任何小部件上使用任何图形效果类都意味着他正在启动一个 QPainter 来渲染效果,很明显我们不能一次使用多个 QPainter 进行绘制设备或表面。
【讨论】:
以上是关于QPainter 在使用 QPropertyAnimation 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 QPainter 在 QOpenGLWidget 中进行叠加 [关闭]