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

qt:如何使用QPropertyImation设置子QPushButton透明度的动画?,qt,animation,Qt,Animation,我想在2秒内逐渐降低QPushButton的不透明度,以完成透明度。为此,我使用QPropertyAnimation类并使用按钮的属性“windowOpacity”来实现效果。但这只适用于一个独立的QPushButton。当我为按钮指定一个父按钮时,效果消失了。是否有任何方法可以为子按钮实现相同的效果?属性windowOpacity仅适用于顶级窗口,因此它无法帮助您在子窗口小部件上设置透明度动画 标准控件有点问题,而且它们的最终外观需要考虑很多因素。您可以采取很多方法,但它们都涉及一定数量的编码

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

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

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

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

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

main window.h:

#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 */
#include <QtGui/QApplication>

#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow m;
    m.show();

    return app.exec();
}
\ifndef主窗口
#定义主窗口
#包括
#包括
类主窗口:公共QWidget
{
Q_对象
Q_属性(int alpha读alpha写setAlpha);
公众:
主窗口();
虚拟主窗口();
私人:
int m_α;
QPushButton*m_按钮1、*m_按钮2;
int alpha()常数;
void setAlpha(const int a_alpha);
};
#endif/*主窗口*/
MainWindow.cpp:(更新以包含样式表透明度示例)

#包括
#包括
#包括“MainWindow.h”
MainWindow::MainWindow():
m_按钮1(0),
m_按钮2(0),
m_alpha(255)
{
调整大小(200200);
QPalette窗口调色板(调色板());
setBrush(qpalete::Background,QBrush(QColor(200,0,0));
设置调色板(窗口调色板);
m_button1=新的QPushButton(此按钮);
m_button1->setText(“调色板透明度”);
m_按钮1->setAutoFillBackground(假);
//注意:更改按钮背景色不适用于XP样式
//所以我们需要使用一种允许它的风格。
m_按钮1->setStyle(新的QPlastiqueStyle());
m_button2=新的QPushButton(本);
m_按钮2->移动(0,50);
m_button2->setText(“样式表透明度”);
m_按钮2->setAutoFillBackground(假);
m_按钮2->设置样式(新的QPlastiqueStyle());
QPropertyAnimation*动画=新的QPropertyAnimation(此为“alpha”);
动画->设置持续时间(1000);
动画->设置关键值(0,255);
动画->设置关键值(0.5100);
动画->设置关键值(1255);
动画->设置循环计数(-1);
动画->开始();
}
MainWindow::~MainWindow()
{
}
int主窗口::alpha()常量
{
返回m_α;
}
void主窗口::setAlpha(常量int a_alpha)
{
m_alpha=a_alpha;
Qpalete按钮调色板(m_button1->palete());
QColor按钮颜色(buttonpalete.button().color());
按钮颜色设置α(m_α);
buttonPalette.setBrush(QPalette::Button,QBrush(buttonColor));
m_button1->setpalete(buttonpalete);
QString样式表(“背景色:rgba(0200,0,+QString::number(m_alpha)+”);”;
m_按钮2->设置样式表(样式表);
}
main.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 */
#include <QtGui/QApplication>

#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow m;
    m.show();

    return app.exec();
}
#包括
#包括“MainWindow.h”
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
主窗口m;
m、 show();
返回app.exec();
}

不久前,我遇到了同样的问题,找到了基本相同的解决方案(操纵控件调色板)。但是,虽然主窗口中的helper属性确实是一个快速而简单的解决方案,但它也是一个肮脏的解决方案。因此,至少对于更大的重复使用,它更适合创建一个新的动画类来满足这些需求。这不需要太多的代码(只需继承QAbstractAnimation,将调色板内容移到其中,并将目标控件作为参数传递到该类中),但它使您的父控件(如mainwindow类)不受此类动画实现细节的影响,这些细节肯定不属于该类。

非常感谢。它起作用了,但如果我通过样式表设置颜色就不行了。为了使边框和文本也透明,需要操作哪些函数?Qpalete文档中提供了您需要的所有内容。这里有很多,但是一些阅读和实验我提供的代码会让你达到目的。这就是我所做的:)我已经更新了示例代码,添加了一个基于样式表的透明按钮,因为您提到您无法让它工作。