实现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

世界地图矢量数据可以通过多种网站进行下载。以下是一些提供免费下载世界地图矢量数据的网站: 1. Open Street Map (https://www.openstreetmap.org/): 这个网站可以根据输入的经纬度或手动选定范围来导出目标区域的矢量图。导出的数据格式为osm格式,但只支持矩形范围的地图下载。 2. Geofabrik (http://download.geofabrik.de/): Geofabrik提供按洲际和国家快速下载全国范围的地图数据。数据格式支持shape文件格式,包含多个独立图层,如道路、建筑、水域、交通、土地利用分、自然景观等。数据每天更新一次。 3. bbbike (https://download.bbbike.org/osm/): bbbike提供全球主要的200多个城市的地图数据下载,也可以按照bbox进行下载。该网站还提供全球的数据,数据格式种齐全,包括geojson、shp等。 4. GADM (https://gadm.org/index.html): GADM提供按国家或全球下载地图数据的服务。该网站提供多种格式的数据下载。 5. L7 AntV (https://l7.antv.antgroup.com/custom/tools/worldmap): L7 AntV是一个提供标准世界地图矢量数据免费下载的网站。支持多种数据格式下载,包括GeoJSON、KML、JSON、TopJSON、CSV和高清SVG格式等。可以下载中国省、市、县的矢量边界和世界各个国家的矢量边界数据。 以上这些网站都提供了世界地图矢量数据的免费下载服务,你可以根据自己的需求选择合适的网站进行下载。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡的大白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值