Bootstrap

实现QPushButton切换不同背景颜色的类

1、 问题提出

在有些场景中,按钮控件需要在不同条件下,切换自己设定的背景颜色。本文实现了一个这样的类,通过预先指定要切换的颜色列表,通过颜色在颜色在颜色列表中的索引值,很方便地进行颜色的切换。

2、实现思路

Qt中,使用QObject::setProperty()为一个控件设置一个动态属性,样式表设置相应的伪属性,就可以在程序运行中动态地改变控件的颜色或其他外观属性。

bool QObject::setProperty(const char *name, const QVariant &value)

注意:使用QObject::setProperty()动态地设置某一个属性为有效(true)时,必须设置其他属性为无效(false),否则,实现不了预想结果

3、QPushButton派生出一个类,便于使用

如果把样式表的设置通过代码实现,该问题就迎刃而解。请看以下ColorButton类。

#ifndef COLORBUTTON_H
#define COLORBUTTON_H

#include <QObject>
#include <QPushButton>

class ColorButton : public QPushButton
{
    Q_OBJECT
public:
    explicit ColorButton(QWidget *parent = nullptr);

    bool setButtonColor(int num);
    //设置颜色列表
    void setColorList(const QList<QColor> &colorList);
signals:

public slots:
private:
    QStringList m_list; //存储每个颜色对应的属性

};

#endif // COLORBUTTON_H
#include "colorbutton.h"
#include<QStyle>
#include<QString>
#include <QVariant>
#include<QDebug>

ColorButton::ColorButton(QWidget *parent) : QPushButton(parent)
{

}

bool ColorButton::setButtonColor(int num)
{
    for (int i=0;i<m_list.count() ;i++ )
    {
        setProperty(m_list.at(i).toStdString().c_str(),(i==num));
    }
    style()->polish(this);
    return true;
}

void ColorButton::setColorList(const QList<QColor> &colorList)
{

    m_list.clear();
    QString sheetStyle;
    for(int i=0;i<colorList.count();i++)
    {
        QString colorName=colorList.at(i).name();
        m_list<<QString("color%1").arg(i);

        sheetStyle+=QString("QPushButton[color%1=true]{"
                            "background-color:%2;}").arg(i).arg(colorName);
    }
    setStyleSheet(sheetStyle);

}

4、ColorButton类的使用举例

1)设置颜色列表

void setColorList(const QList<QColor> &colorList);

2)通过数字设置颜色。通过所设置颜色在颜色列表中的索引编号。第一个颜色对应0,以此类推。

bool setButtonColor(int num);

可以在你的程序里这样验证;

ColorButton *btn=new ColorButton(this);
btn->setColorList(QList<QColor>()<<Qt::red<<QColor(200,100,0)<<Qt::green);
btn->setButtonColor(2); //Qt::green

如果您的工程中,按钮是直接拖出来的,可以将QPushButton提升为ColorButton

;