qt:如何使用QPropertyAnimation为子QPushButton的透明度设置动画?

时间:2010-10-17 13:27:39

标签: qt animation

我希望在2秒的时间内逐渐降低QPushButton的不透明度,以完成透明度。为此我使用了QPropertyAnimation类并使用按钮的属性“windowOpacity”来实现效果。但这仅适用于独立的QPushButton。当我为按钮指定了父级时,效果消失了。是否有任何方法可以实现儿童按钮的相同效果?

2 个答案:

答案 0 :(得分:14)

windowOpacity属性仅适用于顶级窗口,因此不幸的是,它无法帮助您在子窗口小部件上设置透明度动画。

标准控件有点问题,并且有许多因素有助于它们的最终外观。您可以采取许多方法,但它们都涉及一定数量的编码。没有简单的方法:)

要设置QPushButton的透明度,您需要为其设置样式表,或更改调色板的某些属性。由于这两个选项都不能由QPropertyAnimation直接使用,因此您可以创建自己的自定义属性并为其设置动画。

以下是一些代码,用于指定名为MainWindow的{​​{1}}的自定义属性。 alpha值用于设置按钮颜色的alpha部分。有了这个属性,我们可以使用alpha为它设置动画。结果是一个淡入淡出的按钮。这只处理按钮背景而不处理文本,但它应该为您提供一个起点。

<强> MainWindow.h:

QPropertyAnimation

MainWindow.cpp: (已更新以包含样式表透明度示例)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QPushButton>

class MainWindow : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int alpha READ alpha WRITE setAlpha);

public:
    MainWindow();
    virtual ~MainWindow();

private:
    int m_alpha;
    QPushButton * m_button1, *m_button2;

    int alpha() const;
    void setAlpha(const int a_alpha);
};

#endif  /* MAINWINDOW_H */

<强> main.cpp中:

#include <QPlastiqueStyle>
#include <QPropertyAnimation>

#include "MainWindow.h"

MainWindow::MainWindow() :
    m_button1(0),
    m_button2(0),
    m_alpha(255)
{
    resize(200, 200);
    QPalette windowPalette(palette());
    windowPalette.setBrush(QPalette::Background, QBrush(QColor(200, 0, 0)));
    setPalette(windowPalette);

    m_button1 = new QPushButton(this);
    m_button1->setText("Palette Transparency");
    m_button1->setAutoFillBackground(false);
    // NOTE: Changing the button background color does not work with XP Styles
    // so we need to use a style that allows it.
    m_button1->setStyle(new QPlastiqueStyle());

    m_button2 = new QPushButton(this);
    m_button2->move(0, 50);
    m_button2->setText("Stylesheet Transparency");
    m_button2->setAutoFillBackground(false);
    m_button2->setStyle(new QPlastiqueStyle());

    QPropertyAnimation *animation = new QPropertyAnimation(this, "alpha");
    animation->setDuration(1000);
    animation->setKeyValueAt(0, 255);
    animation->setKeyValueAt(0.5, 100);
    animation->setKeyValueAt(1, 255);
    animation->setLoopCount(-1);
    animation->start();
}

MainWindow::~MainWindow()
{
}

int MainWindow::alpha() const
{
    return m_alpha;
}

void MainWindow::setAlpha(const int a_alpha)
{
    m_alpha = a_alpha;

    QPalette buttonPalette(m_button1->palette());
    QColor buttonColor(buttonPalette.button().color());
    buttonColor.setAlpha(m_alpha);
    buttonPalette.setBrush(QPalette::Button, QBrush(buttonColor));
    m_button1->setPalette(buttonPalette);

    QString stylesheet("background-color: rgba(0,200,0," + QString::number(m_alpha) + ");");
    m_button2->setStyleSheet(stylesheet);

}

答案 1 :(得分:1)

前一段时间我遇到了同样的问题,并且基本上采用了相同的解决方案(操纵控件调色板)。但是,虽然MainWindow中的辅助属性肯定是一个快速简便的解决方案,但它也是一个肮脏的解决方案。因此,至少对于更大和重复使用它来说,更适合创建一个涵盖这些需求的新动画类。这不是更多的代码(简单地继承QAbstractAnimation,在那里移动那些调色板的东西并将目标控件作为参数传递到该类中)但它保持你的父控件(如mainwindow-class)免于这样的动画实现细节肯定不属于那里。