我的编程空间,编程开发者的网络收藏夹
学习永远不晚

QSS样式表实现界面换肤功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

QSS样式表实现界面换肤功能

前言

本篇,我们将对QSS样式表进行简单介绍,并且使用QSS样式表实现界面换肤功能。

一、实现效果

通过点击主界面的设置按钮,进入皮肤设置界面。选择想要设置的皮肤,并单击确定就能实现界面换肤。

在这里插入图片描述

二、QSS简介及用法

1.什么是QSS?

  • QSS是Qt Style Sheet的简称,也叫Qt样式表。在操作Qt制作软件界面的过程中,允许我们使用QSS自定义小部件的外观,以及通过子类化QStyle实现想要的功能界面。

2.怎么使用QSS?

  • QSS共有两种使用方法
  • 第一种是窗口内的单个控件直接调用setStyleSheet函数,将某个控件的外观进行自定义操作
  • 第二种是编写后缀为.qss文件,通过读取.qss文件的方式,批量更改窗口内所有或部分控件外观

三、QSS用法一:单个控件调用setStyleSheet函数

  • 友情提示:下拉至文章末尾可以查看样式表属性及其含义的链接
  • 调用语句:控件指针 -> setStyleSheet("控件类型{属性1:属性值;属性2:属性值;}");
  • 调用实例如下:
 //创建标签
    QLabel *title = new QLabel("iQIYI爱奇艺",this);
    //标签位置大小初始化
    title->setGeometry(250,265,180,50);
    //使用样式表自定义标签外观
    title->setStyleSheet("QLabel{font-size:30px;font-style:微软雅黑;font-weight:bold}");

以上案例实现了,将标签中的文字设置为:30px(字号),微软雅黑(字体),bold(加粗)

四、QSS用法二:编写单个界面.qss文件的并读取

1.创建qss文件

(1)在工程文件中,创建新建文本文档(记事本)、

在这里插入图片描述

(2)将新建文本文档后缀改为.qss

在这里插入图片描述

(3)以记事本打开的方式对.qss文件进行编辑

在这里插入图片描述

2. qss文件语法格式

  • 语法格式:选择器{属性1:属性值;属性2:属性值;}
  • 选择器类型如下表格:
类型实例含义
通配选择器*匹配所有控件
类型选择器QPushButton匹配所有QPushButton和其子类的实例
属性选择器QPushButton[flat="false"]匹配所有flat属性是false的QPushButton实例(可以是自定义属性,)
类选择器.QPushButton匹配所欲哦QPushButton的实例,但不匹配其子类,注意前面有一个点号
ID选择器#myButton匹配所有id为myButton的控件实例,这里的id需要用setObjectName函数设置
后代选择器QDialog QPushButton所有QDialog容器中包含的QPushButton(直接或间接)
子选择器QDialog > QPushButton所有QDialog容器下面的QPushButton(直接)

 

.qss文件实例

在这里插入图片描述

3.读取qss文件

我们可以在窗口中,以读入qss文件到字符串的方式,设置该窗口的QSS,具体代码如下。

void startWin::setQss(QString filename)
{
	//创建文件
    QFile file(filename);
    //只读方式打开文件
    file.open(QFile::ReadOnly);
    //将文件转换成文本流形式
    QTextStream filetext(&file);
    //将文本流中的所有字符存入新建字符串
    QString stylesheet = filetext.readAll();
    //设置该窗口的QSS
    this->setStyleSheet(stylesheet);
    //关闭文件
    file.close();
}

4.界面换肤

  • 提前创建好同一界面下,不同控件外观的qss文件,如下图所示。

在这里插入图片描述

以信号触发的方式进行换肤,下图为按钮单击信号触发的槽函数

void setWin::changeQssColor()
{
    //接收下拉框当前文本信息
    QString str = this->combo->currentText();

    //获取主界面
    startWin *start = startWin::getInstance();

    //根据下拉框信息,设置不同皮肤
    if(str == "天际蓝")
    {
        start->setQss("./qss/start1.qss");
    }
    else if(str == "低调灰")
    {
        start->setQss("./qss/start2.qss");
    }
    else if(str == "清新绿")
    {
        start->setQss("./qss/start3.qss");
    }
    else if(str == "活力紫")
    {
        start->setQss("./qss/start4.qss");
    }

    //关闭设置界面
    this->close();
}

五、完整源码

1.main.cpp文件

#include "widget.h"
#include <QApplication>
#include "startwin.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    startWin *w = startWin::getInstance();
    w->show();
    return a.exec();
}

2.startwin.h文件

#ifndef STARTWIN_H
#define STARTWIN_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QListWidget>
#include <QCloseEvent>

class startWin : public QWidget
{
    Q_OBJECT
private:
    explicit startWin(QWidget *parent = 0);
    static startWin *start;
public:
    static startWin *getInstance();
    QLabel *bg,*leftPic,*rightPic,*topPic;
    QLineEdit *edit1;
    QPushButton *newBtn1,*newBtn2,*newBtn3,*newBtn4,*newBtn5,*newBtn6,*newBtn7,*newBtn8;
    QVBoxLayout *leftLayout;
    QHBoxLayout *topLayout;
    QListWidget *videowins;
    QWidget *leftWin,*topWin;
    void closeEvent(QCloseEvent *event);
    void setQss(QString filename);
signals:

public slots:
    void settingSlot();
    void choseSolt();
};

#endif // STARTWIN_H

3.startwin.cpp文件

#include <QDir>
#include <QDebug>
#include <QPixmap>
#include <QStringList>
#include <QMessageBox>
#include "startwin.h"
#include "setwin.h"

startWin* startWin::start = nullptr;


startWin::startWin(QWidget *parent) : QWidget(parent)
{
    //设置主界面窗口大小
    this->setFixedSize(1200,747);

    //设置默认QSS
    this->setQss("./qss/start3.qss");

    //窗口背景图(白底)
    this->bg = new QLabel(this);
    this->bg->setGeometry(0,0,1200,747);
    this->bg->setPixmap(QPixmap("./picture/logic2.png"));
    this->bg->setScaledContents(true);

    //左窗口背景图
    this->leftPic = new QLabel(this);
    this->leftPic->setObjectName("leftPic");
    this->leftPic->setGeometry(0,0,181,747);

    //右上角图片
    this->rightPic = new QLabel(this);
    this->rightPic->setObjectName("rightPic");
    this->rightPic->setGeometry(655,0,545,70);

    //顶部图片传一log
    this->topPic = new QLabel(this);
    this->topPic->setGeometry(220,15,400,50);
    this->topPic->setPixmap(QPixmap("./picture/log.png"));
    this->topPic->setScaledContents(true);

    
    this->leftWin = new QWidget(this);
    this->leftWin->setGeometry(20,0,150,747);

    //创建垂直布局管理器
    this->leftLayout = new QVBoxLayout(leftWin);

    //压缩布局
    this->leftLayout->addStretch();

    //创建按钮内容链表
    QStringList leftList;
    leftList << "全部" << "电视剧" << "电影" << "综艺" << "儿童" << "动漫" << "游戏" << "纪录片" << "体育" << "知识" << "直播" << "随刻热点";

    //根据按钮链表内容生成按钮,并添加到垂直布局管理器
    for(int i=0;i<leftList.size();i++)
    {
        //新建按钮
        QPushButton *newBtn = new QPushButton(leftList.at(i));
        //设置按钮的objectname
        newBtn->setObjectName("newBtn");
        //将按钮添加到垂直布局管理器
        leftLayout->addWidget(newBtn);
        //设置各按钮之间的间隔
        leftLayout->addSpacing(16);
        //创建按钮槽函数
        connect(newBtn,SIGNAL(clicked(bool)),this,SLOT(choseSolt()));
    }
    //设置按钮与窗口底部的间隔
    leftLayout->addSpacing(10);

    
    this->topWin = new QWidget(this);
    this->topWin->setGeometry(181,0,1030,70);

    //创建水平布局管理器
    this->topLayout = new QHBoxLayout(topWin);
    this->topLayout->addStretch();

    //登录注册按钮
    this->newBtn6 = new QPushButton("登录");
    this->newBtn6->setFixedSize(50,30);
    this->topLayout->addWidget(newBtn6);
    this->topLayout->addSpacing(10);

    this->newBtn7 = new QPushButton("注册");
    this->newBtn7->setFixedSize(50,30);
    this->topLayout->addWidget(newBtn7);
    this->topLayout->addSpacing(10);

    this->newBtn8 = new QPushButton("个人中心",this);
    this->newBtn8->setGeometry(690,20,80,30);
    this->newBtn8->hide();

    //创建输入框
    this->edit1 = new QLineEdit();
    this->edit1->setFixedSize(150,30);
    this->topLayout->addWidget(edit1);
    this->topLayout->addSpacing(10);

    //创建搜索按钮,并添加到水平布局管理器
    this->newBtn1 = new QPushButton();
    this->newBtn1->setObjectName("newBtn1");
    this->newBtn1->setFixedSize(30,30);
    this->topLayout->addWidget(newBtn1);
    this->topLayout->addSpacing(10);

    //创建设置按钮,并添加到水平布局管理器
    this->newBtn2 = new QPushButton();
    this->newBtn2->setObjectName("newBtn2");
    this->newBtn2->setFixedSize(30,30);
    this->topLayout->addWidget(newBtn2);
    this->topLayout->addSpacing(10);
    connect(this->newBtn2,SIGNAL(clicked(bool)),this,SLOT(settingSlot()));

    //创建缩小按钮,并添加到水平布局管理器
    this->newBtn3 = new QPushButton();
    this->newBtn3->setObjectName("newBtn3");
    this->newBtn3->setFixedSize(30,30);
    this->topLayout->addWidget(newBtn3);
    this->topLayout->addSpacing(10);

    //创建放大按钮,并添加到水平布局管理器
    this->newBtn4 = new QPushButton();
    this->newBtn4->setObjectName("newBtn4");
    this->newBtn4->setFixedSize(30,30);
    this->topLayout->addWidget(newBtn4);
    this->topLayout->addSpacing(10);

    //创建关闭按钮,并添加到水平布局管理器
    this->newBtn5 = new QPushButton();
    this->newBtn5->setObjectName("newBtn5");
    this->newBtn5->setFixedSize(30,30);
    this->topLayout->addWidget(newBtn5);
    this->topLayout->addSpacing(10);

    //创建QListWidget窗口
    this->videowins = new QListWidget(this);
    this->videowins->setGeometry(181,90,1020,657);
    this->videowins->setViewMode(QListView::IconMode);
    this->videowins->setMovement(QListView::Static);
    this->videowins->setResizeMode(QListView::Adjust);
    this->videowins->setIconSize(QSize(1000,500));
    this->videowins->setSpacing(33);

    //存储每个文件夹路径
    QString paths[12] = {"./picture/btn12","./picture/btn11","./picture/btn10","./picture/btn9","./picture/btn8","./picture/btn7","./picture/btn6",
                        "./picture/btn5","./picture/btn4","./picture/btn3","./picture/btn2","./picture/btn1"};

    //遍历各个文件夹显示所有图片信息
    for(int i=0;i<12;i++)
    {
        //Qir定义文件路径
        QDir dir(paths[i]);
        //创建文件筛选链表
        QStringList moviefilenames;
        //添加文件后缀为.png的筛选类型
        moviefilenames << "*.png" << "*.jpg";
        //创建并初始化符合要求的图片到String链表中
        QStringList files = dir.entryList(moviefilenames,QDir::Files|QDir::Readable,QDir::Name);
        //遍历文件链表,将每张图片路径和图片名作为QListWidget的项目添加到QListWidget窗口中
        for(int j = 0; j < files.size(); ++j)
        {
            QString moviename = files.at(j).mid(0,files.at(j).size()-4);
            QListWidgetItem *newitem = new QListWidgetItem(QIcon(QPixmap(paths[i]+"/"+files.at(j))),moviename);
           // newitem->setSizeHint(QSize(,400));   //设置每个item大小
            this->videowins->addItem(newitem);
        }
    }
}

startWin *startWin::getInstance()
{
    //判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
    if(startWin::start == nullptr)
    {
        startWin::start = new startWin();
    }
    return startWin::start;
}

void startWin::closeEvent(QCloseEvent *event)
{
    //创建提示窗口
    QMessageBox *closeMessage = new QMessageBox(QMessageBox::Information,"温馨提示","确认是否退出");
    //显示提示窗口
    closeMessage->show();
    //设置提示窗口按钮
    closeMessage->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
    //接收关闭返回值
    int rec = closeMessage->exec();
    //若点击确定按钮
    if(rec == QMessageBox::Ok)
    {
        event->accept();
    }
    //若点击取消按钮
    else
    {
        event->ignore();
    }
}

void startWin::choseSolt()
{
    //获取触发槽函数的信号
    QString btnText = ((QPushButton*)sender())->text();
    qDebug() << btnText;
    //定义文件路径
    QString path;
    //根据点击不同按钮,设置不同文件路径
    if(btnText == "全部")
    {
        path = "./picture/all";
    }
    if(btnText == "电视剧")
    {
        path = "./picture/btn1";
    }
    if(btnText == "电影")
    {
        path = "./picture/btn2";
    }
    if(btnText == "综艺")
    {
        path = "./picture/btn3";
    }
    if(btnText == "儿童")
    {
        path = "./picture/btn4";
    }
    if(btnText == "动漫")
    {
        path = "./picture/btn5";
    }
    if(btnText == "游戏")
    {
        path = "./picture/btn6";
    }
    if(btnText == "纪录片")
    {
        path = "./picture/btn7";
    }
    if(btnText == "体育")
    {
        path = "./picture/btn8";
    }
    if(btnText == "知识")
    {
        path = "./picture/btn9";
    }
    if(btnText == "直播")
    {
        path = "./picture/btn10";
    }
    if(btnText == "随刻热点")
    {
        path = "./picture/btn11";
    }
    //获取QListWidget的item数
    int count = this->videowins->count();
    //删除QListWidget所有item
    for(int i=0;i<count;i++)
    {
        QListWidgetItem *item = this->videowins->takeItem(0);
        delete(item);
    }
    //将对应路径下的所有图片加载到QListWidget中
    QDir dir(path);
    QStringList moviefilenames;
    moviefilenames << "*.png" << "*.jpg";
    QStringList files = dir.entryList(moviefilenames,QDir::Files|QDir::Readable,QDir::Name);
    for(int i = 0; i < files.size(); ++i)
    {
        QString moviename = files.at(i).mid(0,files.at(i).size()-4);
        QListWidgetItem *newitem = new QListWidgetItem(QIcon(QPixmap(path+"/"+files.at(i))),moviename);
        //newitem->setSizeHint(QSize(240,200));   //设置每个item大小
        videowins->addItem(newitem);
    }
}


void startWin::setQss(QString filename)
{
    QFile file(filename);
    file.open(QFile::ReadOnly);
    QTextStream filetext(&file);
    QString stylesheet = filetext.readAll();
    this->setStyleSheet(stylesheet);
    file.close();
}


void startWin::settingSlot()
{
    setWin *setting = setWin::getInstance();
    setting->setWindowFlags(Qt::WindowStaysOnBottomHint); //窗口置于顶部
    setting->setWindowModality(Qt::ApplicationModal); //阻塞除当前窗体之外的所有的窗体
    setting->show();
}

4.setwin.h文件

#ifndef SETWIN_H
#define SETWIN_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QComboBox>

class setWin : public QWidget
{
    Q_OBJECT
private:
    explicit setWin(QWidget *parent = 0);
    static setWin *setting;
public:
    static setWin *getInstance();
    QLabel *label;
    QPushButton *pushButton;
    QComboBox *combo;
signals:

public slots:
    void changeQssColor();
};

#endif // SETWIN_H

5.setwin.cpp文件

#include <QStringList>
#include "setwin.h"
#include "startWin.h"

setWin* setWin::setting = nullptr;

setWin::setWin(QWidget *parent) : QWidget(parent)
{
    //设置窗口大小
    this->setFixedSize(300,200);

    //创建标签
    this->label = new QLabel("皮肤设置",this);
    this->label->setGeometry(125,20,80,50);

    //创建按钮
    this->pushButton = new QPushButton("确定",this);
    this->pushButton->setGeometry(210,90,50,30);
    connect(this->pushButton,SIGNAL(clicked(bool)),this,SLOT(changeQssColor()));

    //创建下拉框
    this->combo = new QComboBox(this);
    this->combo->move(50,90);
    this->combo->setFixedSize(150,30);
    QStringList QssColor;
    QssColor << "清新绿" << "天际蓝" << "低调灰" << "活力紫";
    this->combo->addItems(QssColor);
}

setWin *setWin::getInstance()
{
    //判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
    if(setWin::setting == nullptr)
    {
        setWin::setting = new setWin();
    }
    return setWin::setting;
}

void setWin::changeQssColor()
{
    //接收下拉框当前文本信息
    QString str = this->combo->currentText();

    //获取主界面
    startWin *start = startWin::getInstance();

    //根据下拉框信息,设置不同皮肤
    if(str == "天际蓝")
    {
        start->setQss("./qss/start1.qss");
    }
    else if(str == "低调灰")
    {
        start->setQss("./qss/start2.qss");
    }
    else if(str == "清新绿")
    {
        start->setQss("./qss/start3.qss");
    }
    else if(str == "活力紫")
    {
        start->setQss("./qss/start4.qss");
    }

    //关闭设置界面
    this->close();
}

6.图片素材及qss文件

   关注博主并在该篇文章下方评论写下邮箱地址,图片素材及相应的qss文件将以压缩包形式发送。

附:QSS样式表属性及含义

    QSS样式表属性可查看:CSDN博主「我是唐」的原创文章《Qt_QSS 样式表属性大全》,原文链接:https://blog.csdn.net/qq_41673920/article/details/97116143。

总结

   以上就是QSS样式表实现界面换肤的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

到此这篇关于QSS样式表实现界面换肤的文章就介绍到这了,更多相关QSS样式表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

QSS样式表实现界面换肤功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

分析Android App中内置换肤功能的实现方式

Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤。系统不提供直接支持,只能自行研究。 换肤,可以认为是动态替换资源(文字、颜色、字体大小、图片、布局文件……)。这个使用编程语言来动态
2022-06-06

Android如何实现Tab切换界面功能

这篇文章主要介绍“Android如何实现Tab切换界面功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android如何实现Tab切换界面功能”文章能帮助大家解决问题。一、实验目的1. 掌握各种高
2023-06-30

Android实现界面左右滑动切换功能

相信大家一定都使用过手机QQ和微信之类的软件,当我们使用时不难发现其界面的切换不仅可以通过点击页标签来实现,还可以通过左右滑动来实现的,耗子君刚开始学Android时就觉得这样的滑动十分酷炫,十分想要自己来实现它。相信大家也和耗子君一样,想
2022-06-06

Java中怎么用lambda表达式实现aop切面功能

这篇“Java中怎么用lambda表达式实现aop切面功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么用la
2023-06-29

微信小程序点击实现样式切换功能的方法

本篇内容主要讲解“微信小程序点击实现样式切换功能的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序点击实现样式切换功能的方法”吧!普通的web开发可以通过JavaScript获取HT
2023-06-26

Java如何使用正则表达式实现替换文本功能

本篇文章给大家分享的是有关Java如何使用正则表达式实现替换文本功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:package replaceDemo;import
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录