2013-09-30 3 views
16

私はフェードインしようとしており、QLabelをフェードアウトしようとしています。それに関しては、QWidgetサブクラスです。私はQGraphicsEffectで試してみましたが、残念ながらWindowsではうまく動作し、Macではうまく動作しません。Qtウィジェットをフェードインまたはフェードアウトするにはどうすればいいですか?

両方マック& Windowsは、私がQPainterの不透明度を設定し、また私の派生QLabelで「不透明度」のQ_PROPERTYを定義し、QPropertyAnimationて不透明度を変更する独自のカスタムpaintEventを持っているように見える上で動作することができる唯一の他のソリューション。

参考のため、適切なコードスニペットの下に貼り付けています。私はまだここに問題が見えます - 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); 
} 
+0

のQt APIは、あなたがそれを使用することを意図していなかった方法でそれを使用しているあなたを語っています。ウィジェットは、そのようなコンテンツをアニメートしたいときには素晴らしいパフォーマーではありません。概念実証のためにはうまくいくかもしれませんが、長期的にはQt Quickを使用する必要があります。 Qt Quick 1またはQt Quick 2のどちらを使用するかはあなた次第です.Qt Quick 1(宣言モジュール)でさえも、あなたがやっていることを改善するでしょう。 –

答えて

1

QGraphicsSceneにウィジェットを入れることができます。これは、不透明度の変更とアニメーションをサポートします。

例については、QGraphicsProxyWidgetのドキュメントを参照してください。

1

は、それをアニメーションラベルのプロパティとしてパレットの一部を公開してみてください。

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); 
} 

あなたはQPalette qRegisterAnimationInterpolatorを処理する新しい補間を定義して登録することにより、サブクラス化を避ける試すことができますが、これは少し複雑です。

20

実際には、乱雑なことなしにこれを行う簡単な方法があります。QGraphicsProxyWidgetという厄介な要件はありません。これは、昇格したウィジェットの子供では機能しません。下記の手法は、プロモーションされたウィジェットとその子ウィジェットでも機能します。

ウィジェット

// 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); 

フェードインフェードアウトウィジェット

// 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. 
関連する問題