效果如下:

问题:标题的换肤背景未显示出来

要实现换肤功能,我们先创建一个基于drop_shadow_widget的护肤界面,我们将换肤界面分为上中下三部分。(drop_shadow_widget的功能一会说)

  • 上部含有两个QLabel和一个QPushButton按钮。
  • 中间先显示首页8个皮肤,根据不同的页面加载不同的皮肤,当皮肤更新时,重新显示新皮肤。(封装一个类包含3个QLabel 和一个QPushButton)
  • 底部用于显示页码
#pragma once
/*功能:上一页,下一页,换肤按钮
*/
#include <QDialog>
#include <QWidget>
#include <QSignalMapper>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include "common.h"
#include "push_button.h"
#include "change_skin_widget.h"
#include "drop_shadow_widget.h"
class skin_widget : public drop_shadow_widget
{Q_OBJECTpublic:skin_widget(QWidget *parent=0);~skin_widget();void translateLanguage();protected://重画事件void painEvent(QPaintEvent *event);
signals:void changeSkin(QString skin_name);private slots:void showPage(QString current_skin);void varyfySkin();private:void initTitle();void initCenter();void initBotton();
private:QString skin_name;  //背景图片bool is_change;     //是否改变背景QStringList skin_list; QStringList tip_list;QHBoxLayout *title_layout;QGridLayout *center_layout;QHBoxLayout *botton_layout;QLabel *title_label;      //标题QLabel *title_icon_label; //标题图标push_button *close_button;//关闭按钮int page_count;           //总页数int page_count_point;     //最后一页的显示个数int current_page;         //当前为第几页QPushButton *frist_page_button;QPushButton *previous_page_button;QPushButton *next_page_button;QPushButton *last_page_button;QList<change_skin_widget *>change_skin_list;
};
#include "skin_widget.h"
#include "util.h"
skin_widget::skin_widget(QWidget *parent): drop_shadow_widget(parent)
{this->resize(620,445);skin_name = QString("");is_change = false;current_page = 1;this->initTitle();this->initCenter();this->initBotton();QVBoxLayout *main_layout = new QVBoxLayout();main_layout->addLayout(title_layout);main_layout->addLayout(center_layout);main_layout->addLayout(botton_layout);main_layout->addStretch();main_layout->setSpacing(0);main_layout->setContentsMargins(SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH);setLayout(main_layout);this->translateLanguage();//将十进制数转换为字符串类型this->showPage(QString::number(current_page, 10));
}skin_widget::~skin_widget()
{}
void skin_widget::initTitle()
{title_label = new QLabel();title_icon_label = new QLabel();close_button = new push_button();QPixmap title_pixmap(":/img/safe");title_icon_label->setPixmap(title_pixmap);title_icon_label->setFixedSize(16,16);//图片自适应窗口控件的大小title_icon_label->setScaledContents(true);close_button->setPicName(":/sysButton/close");title_label->setFixedHeight(30);title_layout = new QHBoxLayout();title_layout->addWidget(title_icon_label,0,Qt::AlignVCenter);title_layout->addWidget(title_label,0,Qt::AlignVCenter);title_layout->addStretch();title_layout->addWidget(close_button,0,Qt::AlignTop);title_layout->setSpacing(5);title_layout->setContentsMargins(10,0,5,0);//title_label->setObjectName("whiteLabel");connect(close_button,SIGNAL(clicked()),this,SLOT(hide()));
}
void skin_widget::initCenter()
{skin_list << ":/skin/0" << ":/skin/1" << ":/skin/2" << ":/skin/3" << ":/skin/4" <<":/skin/5" << ":/skin/6" << ":/skin/7" << ":/skin/8" << ":/skin/9" <<":/skin/10" << ":/skin/11" << ":/skin/12" << ":/skin/13" << ":/skin/14" <<":/skin/15" << ":/skin/16" << ":/skin/17" << ":/skin/18" << ":/skin/19" <<":/skin/20" << ":/skin/21" << ":/skin/22" << ":/skin/23";center_layout = new QGridLayout();center_layout->setSpacing(5);center_layout->setContentsMargins(5, 35, 5, 0);for (int i = 0; i < 8;i++){change_skin_widget *change_skin_widge = new change_skin_widget();change_skin_list.append(change_skin_widge);connect(change_skin_widge,SIGNAL(changeSkin()),this,SLOT(varyfySkin()));center_layout->addWidget(change_skin_widge,i/4,i%4);}int skin_list_count = skin_list.size();page_count = skin_list_count / 8;page_count_point = skin_list_count % 8;  //最后一页显示的个数//就算最后一页不满8个,也得新增一页if (page_count_point>0){page_count = page_count + 1;}}
//显示页码
void skin_widget::initBotton()
{QSignalMapper *signal_mapper = new QSignalMapper(this);QList<QPushButton *>*button_list = new QList<QPushButton *>();for (int i = 0; i < page_count;i++){QPushButton *page_button = new QPushButton();page_button->setFixedWidth(20);page_button->setText(QString::number(i+1,10));page_button->setObjectName("blueButton");page_button->setCursor(Qt::PointingHandCursor);connect(page_button,SIGNAL(clicked()),signal_mapper,SLOT(map()));signal_mapper->setMapping(page_button,page_button->text());//压入列表button_list->push_back(page_button);}frist_page_button = new QPushButton();previous_page_button = new QPushButton();next_page_button = new QPushButton();last_page_button = new QPushButton();frist_page_button->setFixedWidth(50);previous_page_button->setFixedWidth(50);next_page_button->setFixedWidth(50);last_page_button->setFixedWidth(50);frist_page_button->setCursor(Qt::PointingHandCursor);previous_page_button->setCursor(Qt::PointingHandCursor);next_page_button->setCursor(Qt::PointingHandCursor);last_page_button->setCursor(Qt::PointingHandCursor);frist_page_button->setObjectName("blueButton");previous_page_button->setObjectName("blueButton");next_page_button->setObjectName("blueButton");last_page_button->setObjectName("blueButton");connect(frist_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));connect(previous_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));connect(next_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));connect(last_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));signal_mapper->setMapping(frist_page_button, "first");signal_mapper->setMapping(previous_page_button, "previous");signal_mapper->setMapping(next_page_button, "next");signal_mapper->setMapping(last_page_button, "last");connect(signal_mapper, SIGNAL(mapped(QString)), this, SLOT(showPage(QString)));//布局botton_layout = new QHBoxLayout();botton_layout->addStretch();botton_layout->addWidget(frist_page_button,0,Qt::AlignCenter);botton_layout->addWidget(previous_page_button, 0, Qt::AlignCenter);for (int i = 0; i < button_list->count();i++){QPushButton *page_button = button_list->at(i);botton_layout->addWidget(page_button,0,Qt::AlignCenter);}botton_layout->addWidget(next_page_button, 0, Qt::AlignCenter);botton_layout->addWidget(last_page_button, 0, Qt::AlignCenter);botton_layout->addStretch();botton_layout->setSpacing(2);botton_layout->setContentsMargins(0,10,0,0);
}
void skin_widget::showPage(QString current_skin)
{if (current_skin == "first"){current_page = 1;}else if (current_skin == "previous"){if (current_page>1){current_page = current_page - 1;}}else if (current_skin == "next"){if (current_page<page_count){current_page = current_page + 1;}}else if (current_skin == "last"){current_page = page_count;}else{bool ok;current_page = current_skin.toInt(&ok,10);}if (current_page==1){next_page_button->show();last_page_button->show();frist_page_button->hide();previous_page_button->hide();}else if (current_page==page_count){next_page_button->hide();last_page_button->hide();frist_page_button->show();previous_page_button->show();}else{next_page_button->show();last_page_button->hide();frist_page_button->hide();previous_page_button->show();}//第一页为0-7 显示至previous_total_pageint previous_total_page = (current_page - 1) % 8;int tip_index = previous_total_page;for (int i = 0; i < change_skin_list.count();i++){change_skin_list.at(i)->changeSkin(":/skin/" + QString::number(previous_total_page++, 10), tip_list.at(tip_index++), "11");}}
void skin_widget::translateLanguage()
{title_label->setText(tr("title"));close_button->setToolTip(tr("close"));frist_page_button->setText(tr("first"));previous_page_button->setText(tr("previous"));next_page_button->setText(tr("next"));last_page_button->setText(tr("last"));tip_list << tr("profound life") << tr("blue sea") << tr("red heart") << tr("lovely baby") << tr("transparent water") <<tr("flower") << tr("great sunshine") << tr("shadow amazement") << tr("life in blossom") << tr("360 pet") <<tr("beautiful stone") << tr("yellow energy") << tr("magic world") << tr("intense emotion") << tr("dream sky") <<tr("angry bird") << tr("graceful jazz") << tr("card") << tr("summer cool") << tr("blue world") <<tr("woodwind") << tr("pink mood") << tr("across time") << tr("six year");
}
void skin_widget::varyfySkin()
{QObject *object = QObject::sender();change_skin_widget *change_skin_widge = qobject_cast<change_skin_widget *>(object);skin_name = change_skin_widge->getPixmapName();this->skin_name = skin_name;is_change = true;update();emit changeSkin(skin_name);
}
void skin_widget::painEvent(QPaintEvent *event)
{drop_shadow_widget::paintEvent(event);//QString skin_name = util::getSkinName();int height = 35;//换肤界面标题栏的背景设计QPainter painter(this);painter.setPen(Qt::NoPen);painter.setBrush(Qt::white);painter.drawPixmap(QRect(SHADOW_WIDTH, SHADOW_WIDTH, this->width() - 2 * SHADOW_WIDTH, this->height() - 2 * SHADOW_WIDTH), QPixmap(skin_name));painter.drawRect(QRect(SHADOW_WIDTH, height, this->width() - 2 * SHADOW_WIDTH, this->height() - height - SHADOW_WIDTH));
}

注:换肤界面含有阴影边框,其实实现在drop_shadow_widget类中。
本文转自:http://blog.sina.com.cn/s/blog_a6fb6cc90101e8nd.html

Qt实现360安全卫士换肤功能相关推荐

  1. Qt - 换肤功能实现

    文章目录 前言 Qt内置风格 QPalette QSS QSS样式 一般样式 选择器 子控件 伪状态 属性 使用 分离QSS 推荐工具 Qsseditor QssStylesheetEditor QS ...

  2. c语言中用qt写换肤,让Qt应用程序支持换肤(Skin)功能

    Qt程序一直给人的印象是正规的GUI程序的模样.在嵌入式Linux下,Qtopia的桌面看起来跟WinCE桌面没有什么两样.相对IPHONE那样的漂亮界面.实在没有什么吸引力. 因此很多嵌入式开发人员 ...

  3. C++ QT结合FFmpeg实战开发视频播放器-13视频播放器换肤功能实现(1)背景属性添加

    视频播放器换肤功能实现(1)背景属性添加 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!

  4. Qt实现360安全卫士9.2

    无私的分享.交流是我的宗旨,欢迎留言.欢迎讨论.欢迎批评指正. Qt实现360安全卫士9.1(旧版本): http://bbs.csdn.net/topics/390508293 Qt实现360安全卫 ...

  5. 使用 css/less 动态更换主题色(换肤功能)

    前言 说起换肤功能,前端应该是非常熟悉了? 一般来说换肤的需求分为几种: 1. 纯前端,直接在页面前端通过点击自由切换限定的几种主题色,切换之后主题色变量存到本地浏览器 2. 在后台配置好色值,传到前 ...

  6. 在Ajax程序中实现无刷新换肤功能(asp.net2.0)

    写了一年多的WEB程序,觉得程序中换肤的功能是非常吸引人眼球的技术.特别是在子父级的WEB平台与论坛上应用广泛,可以突出不同人的风格与个性.       从文章的标题上看是Ajax的无刷新换肤,只是本 ...

  7. [css] 如何实现换肤功能?

    [css] 如何实现换肤功能? css 换肤常见方案 是通过 less/sass/postcss 等css 预处理器,通过它们自身的变量用法,设置不同变量,生成不同的主题样式,但是这些样式都是会被打包 ...

  8. android工程换背景图片,android换肤功能 如何动态获取控件中背景图片的资源id?

    这个是在在做一个换肤功能时遇到的问题. 对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话 ...

  9. Android 换肤功能的实现(Apk插件方式)

    一.概述 由于Android 没有提供一套统一的换肤机制,我猜可能是因为国外更注重功能和体验的原因 所以国内如果要做一个漂亮的换肤方案,需要自己去实现. 目前换肤的方法大概有三种方案: (1)把皮肤资 ...

最新文章

  1. 博弈论速成指南:那些融入深度学习的经典想法和新思路
  2. JVM优化之调整大内存分页(LargePage)
  3. mongodb 主从配置,带auth验证模式
  4. python五十七:str与repr,类似于 java对象中的tostring()方法
  5. mysql性能调优快捷键_mysql优化篇
  6. 【xmind】 使用 Java 生成思维导图
  7. Docker: Jenkins里的pipeline编写基本技巧
  8. 【sklearn第二十四讲】密度估计
  9. swoole 连接mysql_Swoole 优雅的实现 MySQL 连接池
  10. pg数据库的基本操作
  11. 《计算机系统基础》4-6章 简答题
  12. Day709.JShell -Java8后最重要新特性
  13. python掷骰子小游戏编程入门_MicroPython实战:开发一款掷骰子小游戏
  14. Matlab中grid 的使用
  15. 韩国本土IP原生IP站群天堂W奥丁游戏香港站群CN2路线大带宽
  16. luogu P4100 [HEOI2013]钙铁锌硒维生素
  17. 网易云音乐信息爬取(存储为 csv文件)喜马拉雅音乐爬取
  18. 有关C#中重写按钮的onpaint函数,实现按钮形状的用户自定义
  19. Android中级面筋:开发2年的程序员如何短期突击面试?跟着这几步去准备,大厂也不远了
  20. 学会使用Hdlbits网页版Verilog代码仿真验证平台

热门文章

  1. 自然摄影指南——第一章:曝光:多重曝光
  2. easyui 动态修改窗口title
  3. linux虚拟文件系统-文件的打开
  4. 妖怪屋服务器维护9月23日,【阴阳师妖怪屋攻略】9月23日维护更新内容介绍(详细教程)...
  5. 【大数据】Hadoop完全分布式配置(超详细)
  6. android桌面歌词显示,【Android】桌面歌词悬浮效果简单实现
  7. Excel小技巧(下)
  8. Android之getSharedPreferences与getDefaultSharedPreferences的区别
  9. pygame实现俄罗斯方块
  10. c语言不兼容指针类型的赋值,关于C语言指针赋值的问题详解