Sto provando a svanire e ad attenuare un QLabel
o per qualsiasi sottoclasse QWidget
. Ho provato con QGraphicsEffect
, ma sfortunatamente funziona bene solo su Windows e non su Mac.Come far sbiadire o sfumare i widget Qt?
L'unica altra soluzione che può funzionare sia su Mac & di Windows sembra avere la mia personalizzato paintEvent
dove ho impostato l'opacità di QPainter
e anche definire un Q_PROPERTY
per "opacità" nel mio derivato QLabel
e modificare l'opacità attraverso QPropertyAnimation
.
Sto incollando sotto lo snippet di codice pertinente come riferimento. Vedo ancora un problema qui - il riutilizzo del QLabel::paintEvent
non sembra funzionare, funziona solo se eseguo un disegno personalizzato completo utilizzando lo QPainter
, ma non sembra essere un modo semplice e se ho bisogno di farlo per ogni sottoclasse QWidget
voglio svanire, è un incubo. Si prega di chiarire se sto facendo alcuni errori evidenti qui.
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);
}
L'API Qt ti dice lo si usa in un modo che non doveva essere usato . I widget non sono davvero eccezionali se vuoi animare i loro contenuti in questo modo. Potrebbe funzionare per un proof-of-concept, ma a lungo termine dovresti usare Qt Quick. Sia che utilizzi Qt Quick 1 o Qt Quick 2 dipende da te, anche Qt Quick 1 (il modulo dichiarativo) sarebbe un miglioramento rispetto a quello che stai facendo. –