6、Qt QSS界面美化

文章介绍了如何在Qt Widgets应用中利用QSS进行界面美化,并实现按钮点击时界面在银色与黑色风格间切换。项目从创建Qt Widgets应用开始,包括资源文件的添加、QSS文件的应用及控件初始化,如表格、列表、树形视图等的设置。

一、功能介绍

1、根据刘典武大佬和网上查询的资料,进行更改

https://gitee.com/feiyangqingyun/QWidgetDemo#https://gitee.com/feiyangqingyun/qtkaifajingyan

2、使用QSS对界面进行美化 

3、点击按钮,进行界面样式切换(银色和黑色)

二、项目创建

1、新建Qt Widgets应用,名称为MyQSS,基类选择QMainWindow;

在界面上添加要进行美化的控件

3、下载图标

iconfont-阿里巴巴矢量图标库

下载好的图标放在工程目录下的icon文件夹中 

4、新建silvery.css和psblack.css文件,放在工程目录下的qss文件夹中 

5、向项目中添加一个Qt资源文件,名称为file;

右击“MyQSS”->“Add New”

 Qt->Qt Resource File

名称file->下一步 ->完成

添加->添加前缀->把“ /new/prefix1”删掉

 添加->添加文件,把.qss文件和下载的图标都添加进来,添加好之后Ctrl+S保存;

添加好的工程如下

三、代码展示

1、MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void systemInit();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;

    QFile *qssFile;
};

#endif // MAINWINDOW_H

2、MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"

#include <QDir>
#include <QStringListModel>
#include <QFileSystemModel>
#include <QStandardItemModel>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    systemInit();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::systemInit()
{
    //加载样式表
    //QFile file(":/qss/silvery.css");
    qssFile = new QFile(":/qss/psblack.css", this);
    qssFile->open(QFile::ReadOnly);                 //只读方式打开文件
    QString styleSheet = tr(qssFile->readAll());    //转为QString类型
    this->setStyleSheet(styleSheet);                //设置样式表
    qssFile->close();

    //控件禁用
    ui->pushButton->setEnabled(false);
    ui->radioButton->setEnabled(false);
    ui->checkBox->setEnabled(false);
    ui->commandLinkButton->setEnabled(false);
    ui->buttonBox->setEnabled(false);

    //QTableWidget
    ui->tableWidget->setRowCount(10); //设置行数为10
    ui->tableWidget->setColumnCount(5); //设置列数为5
    ui->tableWidget->setWindowTitle("QTableWidget & Item");
    QStringList header;
    header<<"Month"<<"Description";
    ui->tableWidget->setHorizontalHeaderLabels(header);
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("Jan"));
    ui->tableWidget->setItem(1,0,new QTableWidgetItem("Feb"));
    ui->tableWidget->setItem(2,0,new QTableWidgetItem("Mar"));
    ui->tableWidget->setItem(0,1,new QTableWidgetItem("Jan's month"));
    ui->tableWidget->setItem(1,1,new QTableWidgetItem("Feb's month"));
    ui->tableWidget->setItem(2,1,new QTableWidgetItem("Mar's month"));


    //QListWidget
    ui->listWidget->addItem(new QListWidgetItem(QIcon(":/icon/checkBox_indeterminate_00BB9E.png"), tr("1")));
    ui->listWidget->addItem(new QListWidgetItem(QIcon(":/icon/checkBox_indeterminate_262829.png"), tr("2")));
    ui->listWidget->addItem(new QListWidgetItem(QIcon(":/icon/checkBox_indeterminate_404244.png"), tr("3")));
    ui->listWidget->addItem(new QListWidgetItem(QIcon(":/icon/checkBox_indeterminate_969696.png"), tr("4")));

    //QTreeWidget
    QStringList headers;
    headers << "Name" << "Number";
    ui->treeWidget->setHeaderLabels(headers);
    QStringList rootTextList;
    rootTextList << "Root" << "0";
    QTreeWidgetItem *root = new QTreeWidgetItem(ui->treeWidget, rootTextList);
    new QTreeWidgetItem(root, QStringList() << QString("Leaf 1") << "1");
    QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root,                                       QStringList() << QString("Leaf 2") << "2");
    leaf2->setCheckState(0, Qt::Checked);
    QList<QTreeWidgetItem *> rootList;
    rootList << root;
    ui->treeWidget->insertTopLevelItems(0, rootList);

    //QListView
    QStringList strlist;
    strlist<<"A"<<"B"<<"C"<<"D";
    QStringListModel *listModel = new QStringListModel(strlist);
    ui->listView->setModel(listModel);
    ui->listView->setModel(listModel);

    //QTreeView
    QFileSystemModel *fileSystemModel = new QFileSystemModel;
    fileSystemModel->setRootPath(QDir::currentPath());
    ui->treeView->setModel(fileSystemModel);

    //QTableView
    QStandardItemModel* model = new QStandardItemModel(this);
    model->setItem(0, 0, new QStandardItem("张三"));
    model->setItem(0, 1, new QStandardItem("3"));
    model->setItem(0, 2, new QStandardItem("男"));
    ui->tableView->setModel(model);


}

void MainWindow::on_pushButton_clicked()
{

}

void MainWindow::on_pushButton_2_clicked()
{
    QMessageBox::warning(this, tr("My Application"),
                                     tr("The document has been modified.\n"
                                        "Do you want to save your changes?"),
                                     QMessageBox::Save | QMessageBox::Discard
                                     | QMessageBox::Cancel,
                                     QMessageBox::Save);
}

void MainWindow::on_pushButton_3_clicked()
{
    if(qssFile->fileName() == ":/qss/psblack.css")
    {
        qssFile->setFileName(":/qss/silvery.css");
    }
    else
    {
        qssFile->setFileName(":/qss/psblack.css");
    }
    qssFile->open(QFile::ReadOnly);                 //只读方式打开文件
    QString styleSheet = tr(qssFile->readAll());    //转为QString类型
    this->setStyleSheet(styleSheet);                //设置样式表
    qssFile->close();
}

 3、psblack.css

/* -----------------------------黑色-------------------------------
背景颜色:#4F4F4F

字体颜色:#FFFFFF
选中字体颜色:#00BB9E
禁用时字体颜色:#DCE1E6

控件颜色:#262829 #969696
禁用控件颜色: #404244

摁键颜色:#646464 #525252

边框颜色:#969696
选中边框颜色:#00BB9E
禁用边框颜色:#4F4F4F
------------------------------------------------------------ */

/* 图标下载网址 ------------------------------------------------------------
https://www.iconfont.cn/search/index?q=%E4%B8%89%E8%A7%92&page=1&tag=&searchType=icon&fromCollection=-1&fills=
-------------------------------------------------------------------*/

/* 官网教程 ------------------------------------------------------------
https://doc.qt.io/qt-5/stylesheet-examples.html
-------------------------------------------------------------------*/

QWidget {
    background-color: #4F4F4F;
    padding: 0px;
    color: #FFFFFF;
}
/* QMainWindow 主界面------------------------------------------------
QMenBar         菜单栏
QMenu           菜单
QToolBar        工具栏
Central Widget  中心部件
QDockWidget     停靠窗口
QStatusBar      状态栏
QSizeGrip       提示窗口拉伸标志
QMessageBox     无法用QSS设置
---------------------------------------------------------------------*/
/* QMenuBar ---------------------------------------------------------
菜单栏
---------------------------------------------------------------------*/
QMenuBar{
    background-color: #4F4F4F;
    color: #FFFFFF;
    margin: 0px;
    padding: 3px 10px;
    min-height: 20px;
    min-width: 20px;
}
QMenuBar::item{
    background-color: #4F4F4F;
    color: #FFFFFF;
    margin: 0px;
    padding: 3px 10px;
}
QMenuBar::item:selected{
    background-color: #262829;
    border: 1px solid #00BB9E;
}
QMenuBar::item:pressed{
    background-color: #969696;
    border: 1px solid #00BB9E;
}
QMenuBar,QMenuBar:disabled{
    color: #DCE1E6;
    background-color: #4F4F4F;
    border: 1px solid #4F4F4F;
    margin: 0px;
}
/* QMenu ------------------------------------------------------------
菜单
--------------------------------------------------------------------------- */
QMenu::item{
    padding: 3px 20px;
}
QMenu::indicator{
    width: 13px;
    height: 13px;
}
QMenu,QMenu:disabled{
    color: #DCE1E6;
    background-color: #4F4F4F;
    border: 1px solid #4F4F4F;
    margin: 0px;
}
QMenu::item:selected{
    background-color: #262829;
    border: 1px solid #00BB9E;
}
QMenu::item:pressed{
    background-color: #969696;
    border: 1px solid #00BB9E;
}
QMenu::separator{ /*分隔符*/
    height: 1px;
    background-color: #969696;
}
/* QToolBar ------------------------------------------------------------
工具栏
--------------------------------------------------------------------------- */
QToolBar, QToolBar:disabled{
    color: #DCE1E6;
    background-color: #4F4F4F;
    border: 0px solid #4F4F4F;
    border-width: 0px 0px 1px 0px;
    min-height: 30px;
}
QToolBar::separator{
    width: 1px;
    background-color: #969696;
}
QToolBar QToolButton{
    min-height: 30px;
    background-color: #4F4F4F;
    border: 0px solid #969696;
    border-width: 0px 0px 1px 0px;
    color: #FFFFFF;
    border-radius: 0px;
}
QToolBar QToolButton:hover{
    background-color: #262829;
    border: 1px solid #00BB9E;
}
QToolBar QToolButton:pressed{
    background-color: #969696;
    border: 1px solid #00BB9E;
}

/* QStatusBar ------------------------------------------------------------
状态栏
--------------------------------------------------------------------------- */
QStatusBar{
    color: red;
    background-color:#4F4F4F;
}

/* QSizeGrip ------------------------------------------------------------
提示窗口拉伸标志
--------------------------------------------------------------------------- */
QSizeGrip{
    min-height: 20px;
    min-width: 20px;
    border-image: url(https://blog.csdn.net/:/icon/zoom_969696.png);
}
/* QDockWidget ------------------------------------------------------------
停靠窗口:在下面
--------------------------------------------------------------------------- */

/* Buttons 按钮------------------------------------------------------------
QPushButton             推动按钮
QToolButton             工具按钮
QRadioButton            单选按钮
QCheckBox               复选键
QCommandLinkButton	命令链接按钮
QDialogButtonBox              按钮盒
--------------------------------------------------------------------------*/

/* QPushButton ------------------------------------------------------------
摁键
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton

--------------------------------------------------------------------------- */
QPushButton {
    background: qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464 , stop:1 #525252);
    border: 1px solid #969696;
    color: #FFFFFF;
    border-radius: 4px;
    padding: 1px;
    min-height: 25px;
    min-width: 35px;
}
QPushButton:hover {
    background-color: #00BB9E;
    border: 1px solid #00BB9E;
    color: #FFFFFF;
}
QPushButton:pressed {
    background-color: #969696;
    border: 1px solid #00BB9E;
    color: #FFFFFF;
}
QPushButton:focus {
  border: 1px solid #00BB9E;
}
QPushButton:!enabled {
    background-color: #4F4F4F;
    border: 1px solid #404244;
    border-style: inset;
}

/* QToolButton ------------------------------------------------------------

--------------------------------------------------------------------------- */
QToolButton {
    background: qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464 , stop:1 #525252);
    border: 1px solid #969696;
    color: #FFFFFF;
    border-radius: 4px;
    padding: 3px;
    min-height: 20px;
    min-width: 30px;
}
QToolButton:hover {
    background-color: #00BB9E;
    border: 1px solid #00BB9E;
    color: #FFFFFF;
}
QToolButton:pressed {
    background-color: #969696;
    border: 1px solid #00BB9E;
    color: #FFFFFF;
}
QToolButton:focus {
  border: 1px solid #00BB9E;
}
QToolButton[popupMode="0"] {
    padding-right: 2px;
}
QToolButton[popupMode="1"] {
    padding-right: 2px;
}
QToolButton[popupMode="2"] {
    padding-right: 2px;
}
QToolButton::menu-button {
    padding: 2px;
    border-radius: 4px;
    border: 1px solid #969696;
    width: 12px;
    outline: none;
}
QToolButton:menu-button:hover {
    background-color: #00BB9E;
    border: 1px solid #969696;
    color: #FFFFFF;
}
QToolButton:menu-button:pressed {
    background-color: #969696;
    border: 1px solid #00BB9E;
    color: #FFFFFF;
}
QToolButton::menu-arrow {
    image: url("https://blog.csdn.net/:/icon/down_triangle_4F4F4F.png");
    height: 8px;
    width: 8px;
}
QToolButton::menu-arrow:hover {
    image: url("https://blog.csdn.net/:/icon/down_triangle_262829.png");
}
QToolButton::menu-arrow:pressed {
    image: url("https://blog.csdn.net/:/icon/down_triangle_4F4F4F.png");
}
QToolButton:disabled {
    color: #DCE1E6;
    background-color: #4F4F4F;
    border: 1px solid #404244;
}

/* QRadioButton -----------------------------------------------------------

https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton

--------------------------------------------------------------------------- */
QRadioButton {
    background-color: transparent;
    color: #FFFFFF;
    spacing: 4px;
    padding: 0px;
    border: none;
    outline: none;
    min-height: 20px;
    min-width: 30px;
}
QRadioButton:focus {
    border: none;
}
QRadioButton::indicator {
    border: none;
    outline: none;
    margin-left: 4px;
    height: 16px;
    width: 16px;
}
QRadioButton::indicator:unchecked {
    image: url(https://blog.csdn.net/:/icon/radioButton_unselect_969696.png);
}
QRadioButton::indicator:unchecked:hover{
    border: none;
    outline: none;
    image: url(https://blog.csdn.net/:/icon/radioButton_unselect_262829.png);
}
QRadioButton::indicator:unchecked:focus{
    border: none;
    outline: none;
    image: url(https://blog.csdn.net/:/icon/radioButton_unselect_00BB9E.png);
}
QRadioButton::indicator:unchecked:pressed {
    border: none;
    outline: none;
    image: url(https://blog.csdn.net/:/icon/radioButton_unselect_969696.png);
}
QRadioButton::indicator:checked {
    border: none;
    outline: none;
    image: url(https://blog.csdn.net/:/icon/radioButton_select_969696.png);
}
QRadioButton::indicator:checked:hover{
    border: none;
    outline: none;
    image: url(https://blog.csdn.net/:/icon/radioButton_select_262829.png);
}
QRadioButton::indicator:checked:focus{
    border: none;
    outline: none;
    image: url(https://blog.csdn.net/:/icon/radioButton_select_00BB9E.png);
}
QRadioButton::indicator:checked:pressed {
    border: none;
    outline: none;
    image: url(https://blog.csdn.net/:/icon/radioButton_select_969696.png);
}

QRadioButton:disabled{
    background-color: #4F4F4F;
    color: #DCE1E6;
}

QRadioButton::indicator:unchecked:disabled {
    image: url(https://blog.csdn.net/:/icon/radioButton_unselect_404244.png);
}

QRadioButton::indicator:checked:disabled {
    image: url(https://blog.csdn.net/:/icon/radioButton_select_404244.png);
}

/* QCheckBox --------------------------------------------------------------
QT网址
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox
图标网址
https://www.iconfont.cn/search/index?searchType=icon&q=%E5%8D%8A%E9%80%89&page=3&fromCollection=-1&fills=&tag=

--------------------------------------------------------------------------- */
QCheckBox {
    background-color: #4F4F4F;
    color: #FFFFFF;
    spacing: 4px;
    outline: none;
    padding-top: 4px;
    padding-bottom: 4px;
    min-height: 20px;
    min-width: 30px;
}
QCheckBox:disabled {
    background-color: #4F4F4F;
    color: #DCE1E6;
}
QCheckBox::indicator {
    margin-left: 4px;
    height: 16px;
    width: 16px;
}
QCheckBox::indicator:unchecked {
    image: url(https://blog.csdn.net/:/icon/checkBox_unselect_969696.png);
}
QCheckBox::indicator:unchecked:focus {
    image: url(https://blog.csdn.net/:/icon/checkBox_unselect_00BB9E.png);
}
QCheckBox::indicator:unchecked:hover {
    image: url(https://blog.csdn.net/:/icon/checkBox_unselect_00BB9E.png);
}
QCheckBox::indicator:unchecked:pressed {
    image: url(https://blog.csdn.net/:/icon/checkBox_unselect_262829.png);
}
QCheckBox::indicator:unchecked:disabled {
    image: url(https://blog.csdn.net/:/icon/checkBox_unselect_404244.png);
}

QCheckBox::indicator:checked {
    image: url(https://blog.csdn.net/:/icon/checkBox_select_969696.png);
}
QCheckBox::indicator:checked:focus {
    image: url(https://blog.csdn.net/:/icon/checkBox_select_00BB9E.png);
}
QCheckBox::indicator:checked:hover {
    image: url(https://blog.csdn.net/:/icon/checkBox_select_00BB9E.png);
}
QCheckBox::indicator:checked:pressed {
    image: url(https://blog.csdn.net/:/icon/checkBox_select_262829.png);
}
QCheckBox::indicator:checked:disabled {
    image: url(https://blog.csdn.net/:/icon/checkBox_unselect_404244.png);
}
QCheckBox::indicator:indeterminate {
    image: url("https://blog.csdn.net/:/icon/checkBox_indeterminate_969696.png");
}
QCheckBox::indicator:indeterminate:focus {
    image: url(":/
课程亮点       本课程是PySide6零基础入门与项目实战视频教程,经过精心设计,分为十个章节,制作了141页ppt, 接近70个代码示例,主要讲解PySide6开发环境安装、基础控件与界面布局、项目实战,PySide6程序打包,安装包制作,安装卸载、更新,发布等知识。涵盖从基础概念到高级应用的全方位知识,旨在为你提供一条清晰、系统的学习之路。无论你是编程新手,还是希望深化对PySide6的了解,本课程都能满足你的需求。       教学环境:Win11 64bit、Python3.11、PyCharm、Anacoda。课程大纲第一章:基础篇 PySide6开发环境安装        从Anaconda环境配置开始,带你快速入门Win11/win10下PySide6、PyQt5开发环境的安装与配置,分别介绍PyCharm与VSCode如何配置PySide6,  以及Python AnaConda的基本用法,创建虚拟环境,安装python模块。第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍        深入PySide6中的常用控件与界面布局技巧,通过丰富的实例,掌握PySide6的窗口、布局、控件等核心内容。主要介绍QLabel、QPushButton、QLineEdit、QCheckBox、QComboBox、QTextEdit、QTextBrowser、QListView与QListWidget、QStackedWidget、QTabWidget、QTableView等控件以及水平垂直布局,弹簧控件,栅格布局,表单布局。第三章 信号槽与事件机制       解锁PySide6的信号槽机制和事件处理技能,让你的应用更加灵活。详细介绍Qt自定义信号槽,跨窗口传递信号;Qt鼠标事件,键盘事件,组合事件,事件过滤。第四章 QMainWindow应用篇       详细介绍QMainWindow的使用,包括菜单栏、工具栏、状态栏和停靠窗口等。第五章 样式表qss与自定义控件        教你如何使用样式表美化应用界面,并创建独特的自定义控件。掌握这些技能后,学员将能够设计出既美观又功能丰富的用户界面。第六章 图表与曲线        引入pyqtgraph,展示如何在PySide6应用中绘制图表和动态曲线。第七章 数据库编程        带你进入数据库编程世界,使用sqlite3与PySide6结合,进行数据存储和管理。第八章 项目实战:高仿有道词典        通过一个高仿有道词典的项目,将所学知识融会贯通,实战演练。课程中将会接入翻译接口,开发一个属于自己的翻译软件。第九章 打包与部署       教你如何将PySide6项目打包成exe,并使用Inno Setup制作安装包,介绍软件更新、卸载策略,让你的应用轻松上线。第十章 课程总结        回顾整个课程的学习内容,巩固知识点,为进一步的学习和应用打下坚实的基础。教学特色       实战案例:每个章节都配备实战案例,让学习者在实践中深化理解。       代码资料全覆盖:提供全套课程代码资料下载,便于学习者随时查阅和复习。       高效学习路径:课程内容结构清晰,由浅入深,适合不同层次的学习者。       本课程提供全部代码与在线答疑。谁应该学习这个课程       对图形界面开发感兴趣的编程新手。       希望提升个人技能,进入或者深耕在GUI开发领域的开发者。       需要快速掌握PySide6进行项目开发的软件工程师。结语        通过本课程的学习,你不仅能掌握PySide6的核心技能,还能通过实战项目提升解决实际问题的能力,最终让你能独立完成专业的GUI应用开发。随着技术的深入,你将发现PySide6不仅仅是一个工具库,它开启的是一扇通往高效、美观应用开发的大门。        开始PySide6的学习之旅,让你的编程之路更加精彩!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值