qt: Как анимировать прозрачность дочернего QPushButton, используя QPropertyAnimation? - PullRequest
3 голосов
/ 17 октября 2010

Я хочу постепенно уменьшить непрозрачность QPushButton в течение 2 секунд, чтобы завершить прозрачность.Для этого я использовал класс QPropertyAnimation и использовал свойство «windowOpacity» кнопки для достижения эффекта.Но это работало только для автономного QPushButton.Когда я назначил родителю кнопку, эффект исчез.Есть ли способ добиться того же эффекта для дочерних кнопок?

Ответы [ 2 ]

14 голосов
/ 18 октября 2010

Свойство windowOpacity применяется только к окнам верхнего уровня, поэтому, к сожалению, оно не поможет вам с анимацией прозрачности дочерних виджетов.

Стандартные элементы управления немного проблематичны, так как есть много факторов, способствующихих окончательный вид.Есть много подходов, которые вы можете использовать, но все они будут включать определенное количество кода.Нет простого способа:)

Чтобы установить прозрачность QPushButton, вам необходимо либо установить для него таблицу стилей, либо изменить некоторые свойства палитры.Поскольку ни одна из этих опций не может напрямую использоваться QPropertyAnimation, вы можете создать собственное настраиваемое свойство и анимировать его.

Ниже приведен код, который задает настраиваемое свойство для MainWindow с именем alpha.Альфа-значение используется для установки альфа-части цвета кнопки.С этим свойством мы можем использовать QPropertyAnimation для его анимации.В результате появляется кнопка, которая исчезает и исчезает.Это обрабатывает только фон кнопок, а не текст, но должно служить отправной точкой для вас.

MainWindow.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 */

MainWindow.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);

}

main.cpp:

#include <QtGui/QApplication>

#include "MainWindow.h"

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

    MainWindow m;
    m.show();

    return app.exec();
}
1 голос
/ 30 октября 2010

Я столкнулся с той же проблемой некоторое время назад и пришел к тому же решению (манипулирование палитрой элементов управления).Но, хотя вспомогательное свойство в MainWindow, безусловно, является быстрым и простым решением, оно также является грязным.Таким образом, по крайней мере, для более широкого и повторяющегося использования представляется более подходящим создать новый класс анимации, отвечающий этим потребностям.Это не намного больше кода (просто наследуйте QAbstractAnimation, переместите туда эту палитру и передайте целевой элемент управления в качестве параметра в этот класс), но он сохраняет ваш родительский элемент управления (например, класс mainwindow) свободным от таких деталей реализации анимации, которыеконечно, там не место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...