【发布时间】:2013-10-05 22:31:40
【问题描述】:
我正在尝试淡入和淡出QLabel 或任何QWidget 子类。我试过QGraphicsEffect,但不幸的是它只在Windows上运行良好,在Mac上不行。
唯一可以同时在 Mac 和 Windows 上运行的其他解决方案似乎有我自己的自定义 paintEvent,我在其中设置了 QPainter 的不透明度,并在派生的 @987654327 中为“不透明度”定义了一个 Q_PROPERTY @ 并通过QPropertyAnimation 更改不透明度。
我在下面贴上相关代码sn-p,供大家参考。我在这里仍然看到一个问题 - 重用 QLabel::paintEvent 似乎不起作用,它只有在我使用 QPainter 进行完整的自定义绘画时才有效,但这似乎不是一个简单的方法,如果我需要为我想要淡出的每个QWidget 子类执行此操作,这是一场噩梦。请澄清我是否在这里犯了任何明显的错误。
Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity)
void MyLabel::setOpacity(qreal value) {
m_Opacity = value;
repaint();
}
void MyLabel::paintEvent((QPaintEvent *pe) {
QPainter p;
p.begin(this);
p.setOpacity();
QLabel::paintEvent(pe);
p.end();
}
void MyLabel::startFadeOutAnimation() {
QPropertyAnimation *anim = new QPropertyAnimation(this, "opacity");
anim->setDuration(800);
anim->setStartValue(1.0);
anim->setEndValue(0.0);
anim->setEasingCurve(QEasingCurve::OutQuad);
anim->start(QAbstractAnimation::DeleteWhenStopped);
}
【问题讨论】:
-
Qt API 告诉您,您正在以一种不应该被使用的方式使用它。当您想要像这样为它们的内容制作动画时,小部件并不是真正的出色表现者。它可能适用于概念验证,但从长远来看,您应该使用 Qt Quick。无论您使用 Qt Quick 1 还是 Qt Quick 2 都取决于您,即使是 Qt Quick 1(声明性模块)也会比您正在做的事情有所改进。
标签: qt animation opacity fadeout qpainter