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