How to make Qt widgets fade in or fade out?

后端 未结 3 1252
天命终不由人
天命终不由人 2020-12-24 12:54

I am trying to fade in and fade out a QLabel or for that matter any QWidget subclass. I have tried with QGraphicsEffect, but unfortuna

相关标签:
3条回答
  • 2020-12-24 13:40

    Try expose some part of palette as property of label then animate it:

    Q_PROPERTY(QColor color READ color WRITE setColor)
    
    void MyLabel::setColor(const QColor &value) {
        QPalette palette;
        palette.setBrush(QPalette::WindowText, value);
        setPalette(palette);
    }
    
    QColor MyLabel::color() {
        return palette(QPalette::Normal, QPalette::Window).
    }
    
    void MyLabel::startFadeOutAnimation() {
        QPropertyAnimation *animation = new QPropertyAnimation(label, "color", this);
        QColor c = label->color();
        animation->setKeyValueAt(0, c);
        c.setAlpha(0);
        animation->setKeyValueAt(1, c);
        animation->setEasingCurve(QEasingCurve::OutQuad);
        animation->setDuration(1000);
        animation->start(QAbstractAnimation::DeleteWhenStopped);
    }
    

    You can try avoid subclassing by defining and registering new interpolator which will handle QPalette qRegisterAnimationInterpolator, but this is a bit complicated.

    0 讨论(0)
  • 2020-12-24 13:44

    There's actually a super easy way to do this without messy QPaintEvent intercepts and without the tough requirements of QGraphicsProxyWidget, which doesn't work on promoted widget children. The technique below will work even with promoted widgets and their children widgets.

    Fade In Your Widget

    // w is your widget
    QGraphicsOpacityEffect *eff = new QGraphicsOpacityEffect(this);
    w->setGraphicsEffect(eff);
    QPropertyAnimation *a = new QPropertyAnimation(eff,"opacity");
    a->setDuration(350);
    a->setStartValue(0);
    a->setEndValue(1);
    a->setEasingCurve(QEasingCurve::InBack);
    a->start(QPropertyAnimation::DeleteWhenStopped);
    

    Fade Out Your Widget

    // w is your widget
    QGraphicsOpacityEffect *eff = new QGraphicsOpacityEffect(this);
    w->setGraphicsEffect(eff);
    QPropertyAnimation *a = new QPropertyAnimation(eff,"opacity");
    a->setDuration(350);
    a->setStartValue(1);
    a->setEndValue(0);
    a->setEasingCurve(QEasingCurve::OutBack);
    a->start(QPropertyAnimation::DeleteWhenStopped);
    connect(a,SIGNAL(finished()),this,SLOT(hideThisWidget()));
    // now implement a slot called hideThisWidget() to do
    // things like hide any background dimmer, etc.
    
    0 讨论(0)
  • 2020-12-24 13:55

    You can put your widgets into a QGraphicsScene. It supports opacity changing and animation.

    See QGraphicsProxyWidget documentation for an example.

    0 讨论(0)
提交回复
热议问题