Qt 实现管家换肤

一、实现效果截图


换肤

二、自定义Widget

1、SkinItem.h 文件

#ifndef SKINITEM_H

#define SKINITEM_H

#include <QWidget>

#include <QLabel>

#include <QPushButton>

#include <QGridLayout>

class SkinItem : public QWidget

{

    Q_OBJECT

public:

    explicit SkinItem(QWidget *parent = nullptr);

    ~SkinItem();

    //选项是否选中

    void setChecked(bool isChecked);

    //设置图片

    void setPixmap(QString icon,QString content);

private:

    QLabel *m_pContentLabel;//皮肤名称

    QLabel *m_pCheckLabel;//选中

    QPushButton *m_pIconButton;//皮肤图片

    QPushButton *m_pIconlayer;//皮肤图层

    int defwidth,defheight;//宽高

    bool ischecked = false;

    //图片样式

    QString style = "QPushButton#SkinItemIcon{"

                    "border:none;"

                    "background-image:url(%0);"

                    "}"

                    "QPushButton#SkinItemIcon:checked{"

                    "border: 3px solid white;"

                    "}";

signals:

    void clicked(QString);

};

#endif // SKINITEM_H

2、SkinItem.cpp 文件

#include "SkinItem.h"

SkinItem::SkinItem(QWidget *parent) :

    QWidget(parent),

    defwidth(118),

    defheight(78)

{

    //皮肤文本

    m_pContentLabel = new QLabel(this);

    m_pContentLabel->setObjectName("SkinItemTitle");

    m_pContentLabel->setText("皮肤名称");

    m_pContentLabel->setFixedHeight(16);

    //图片

    m_pIconButton = new QPushButton(this);

    m_pIconButton->setFixedSize(QSize(defwidth,defheight));

    m_pIconButton->setObjectName("SkinItemIcon");

    m_pIconButton->setCheckable(true);

    //图片图层

    m_pIconlayer = new QPushButton(m_pIconButton);

    m_pIconlayer->setFixedSize(QSize(defwidth,defheight));

    m_pIconlayer->setObjectName("SkinItemIconlayer");

    m_pIconlayer->setCheckable(true);

    m_pIconlayer->raise();

    //选中控件

    m_pCheckLabel = new QLabel(m_pIconlayer);

    m_pCheckLabel->setFixedSize(20,20);

    m_pCheckLabel->setScaledContents(true);

    m_pCheckLabel->setObjectName("SkinItemCheck");

    m_pCheckLabel->move(defwidth*0.78,defheight*0.68);

    m_pCheckLabel->setVisible(false);

    //布局

    QVBoxLayout *mainlayout = new QVBoxLayout;

    mainlayout->setMargin(0);

    mainlayout->setSpacing(0);

    mainlayout->addWidget(m_pIconButton,0,Qt::AlignCenter);

    mainlayout->addWidget(m_pContentLabel,0,Qt::AlignHCenter);

    setLayout(mainlayout);

    setFixedSize(QSize(defwidth,112));

    //信号与槽

    QObject::connect(m_pIconlayer, &QPushButton::clicked, [this](bool) {

        emit clicked(m_pContentLabel->text().trimmed());

    });

}

SkinItem::~SkinItem()

{

}

/**

* 设置是否选中

* @brief SkinItem::setChecked

* @param isChecked

*/

void SkinItem::setChecked(bool isChecked)

{

    m_pIconlayer->setChecked(isChecked);

    m_pIconButton->setChecked(isChecked);

    m_pCheckLabel->setVisible(isChecked);

}

/**

* 设置图片

* @brief SkinItem::setPixmap

* @param icon

*/

void SkinItem::setPixmap(QString icon, QString content)

{

    m_pIconButton->setStyleSheet(style.arg(icon));

    m_pContentLabel->setText(content);

}

3、使用

    QStringList namelist<<"海之夕阳"<<"阳之光芒"<<"樱花夕阳"<<"未来之途";

    QGridLayout *gridlayout = new QGridLayout;

    for (uint8_t i=0;i

        SkinItem *skinitem = new SkinItem;

        skinitem->setPixmap(QString(":/image/skin/skin%0.png").arg(i),namelist.at(i));

        itemList.append(skinitem);

        gridlayout->addWidget(skinitem,0,i,1,1);

        if(currentId == i){

            skinitem->setChecked(true);

        }

        QObject::connect(skinitem,&SkinItem::clicked,[this](QString str){

            setItemChecked(str);

        });

    }


void SkinDialog::setItemChecked(QString str)

{

    int index = namelist.indexOf(str);

    if(currentId == index){

        return;

    }

    currentId = index;

    for (uint8_t i =0;i

        itemList.at(i)->setChecked(i == index);

    }

    emit updateskin(index);

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容

  • 界面 主窗口界面设计 标题栏:直接设Window-Title属性;Window-icon属性可加图标。底部状态栏:...
    码园老农阅读 3,758评论 1 13
  • 链接:https://www.cnblogs.com/swarmbees/p/5710714.html 说起下拉框...
    你说啥_f478阅读 626评论 0 0
  • 在使用控件布局的时候,用QFrame做容器,用的最多的就是垂直布局和水平布局,再加上垂直和水平的Spacer控件,...
    联旺阅读 613评论 0 0
  • 1 实验目的 目前计算机视觉技术已经比较成熟,相关的开源项目与算法很多,可以将这些开源算法进行整合,进而做成一个小...
    YOUNG_FAN阅读 6,725评论 0 50
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,536评论 28 53