实战PyQt5:112-开源QSS样式表qdarkstyle

使用Python开发应用一个重要的优点是有丰富的第三方库,在开发过程中我们就不需要重复造轮子,而是应用好这些轮子,就可以事半功倍。下面介绍一个深色配置QSS库QDarkStyleSheet,使用它,在PyQt中,只需要简单的一个语句,就可以给用用实现炫酷的深色风格。

QDarkStyleSheet简介

QDarkStyleSheet是一个适用于Qt应用程序的最完整的深色样式表(Qt4,Qt5,PySide,PySide2,PyQt4,PyQt5,QtPy,PyQtGraph,Qt.Py)。使用下面的命令就可以安装最新的稳定版本:

pip install qdarkstyle

在PyQt5中,下面的代码演示了如何使用QDarkStyleSheet

import sys
import qdarkstyle
from PyQt5.QtWidgets import QApplication, QMainWindow
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QMainWindow()
    
    #设置样式表
    app.setStyleSheet(qdarkstyle.load_stylesheet())
    
    window.show()
    sys.exit(app.exec())

安装QDarkStyleSheet

在终端窗口下输入命令 pip install qdarkstyle 即可以安装QDarkStyleSheet, 安装完成后,显示的信息如下图(不同的版本,显示信息可能有差别)

实战PyQt5:112-开源QSS样式表qdartstyle

安装qdarkstyle

运行QDarkStyleSheet样例

QDarkStyleSheet是一个开源包,其源代码地址是:

https://github.com/ColinDuquesnoy/QDarkStyleSheet

下载其最新发布版本(写这篇文章时,最新版本为2.8.1),解压后,其中的example目录中有一个样式的演示工程,运行其文件example.py,效果如下图:

实战PyQt5:112-开源QSS样式表qdartstyle

QDarkStyleSheet开发包自带例子运行效果

测试样例

在前文的样例代码中,使用QDarkStyleSheet开发包来设置应用的样式表,其完整代码如下:

import sys
import qdarkstyle
from PyQt5.QtCore import Qt, QTimer, QDateTime, QDate, QFile
from PyQt5.QtGui import QPalette, QColor
from PyQt5.QtWidgets import (QApplication, QWidget, QMainWindow, QPushButton, QTextEdit, 
                             QGroupBox, QCheckBox, QRadioButton, QComboBox, QLabel,
                             QVBoxLayout, QHBoxLayout, QGridLayout, QStyleFactory,
                             QTabWidget, QSizePolicy, QProgressBar, QTableWidget,
                             QLineEdit, QSpinBox, QDateTimeEdit, QSlider,
                             QScrollBar, QMenu, QMenuBar, QAction, QCalendarWidget, QDial)
 
#标记控制窗口
class DarkStyleSheetDemo(QMainWindow):
    def __init__(self):
        super(DarkStyleSheetDemo, self).__init__()
        
        # 设置窗口标题
        self.setWindowTitle('实战PyQt5: QDarkStyleSheet 演示')
        
        #应用的初始调色板
        self.origPalette = QApplication.palette()
        
        self.initUi()
        
    def initUi(self):
        self.initMenuBar()
               
        #生成要显示的部件
        self.createTopLeftGroupBox()
        self.createTopRightGroupBox()
        self.createBottomLeftTabWidget()
        self.createBottomRightGroupBox()
        self.createProgressBar()
        
        mainLayout = QGridLayout()
        mainLayout.addWidget(self.topLeftGroupBox, 1, 0) #1行0列
        mainLayout.addWidget(self.topRightGroupBox, 1, 1) #1行1列
        mainLayout.addWidget(self.bottomLeftTabWidget, 2, 0) #2行0列
        mainLayout.addWidget(self.bottomRightGroupBox, 2, 1) #2行1列
        mainLayout.addWidget(self.progressBar, 3, 0, 1, 2) ## 3行0列,占1行2列
        mainLayout.setRowStretch(1, 1)
        mainLayout.setRowStretch(2, 1)
        mainLayout.setColumnStretch(0, 1)
        mainLayout.setColumnStretch(1, 1)
        
        mainWidget = QWidget()
        mainWidget.setLayout(mainLayout)
        
        self.setCentralWidget(mainWidget)
           
    #菜单栏设置
    def initMenuBar(self):
        mBar = self.menuBar()
        
        menuFile = mBar.addMenu('文件(&F)')          
        aExit = QAction('退出(&X)', self)
        aExit.triggered.connect(self.close)
        menuFile.addAction(aExit)
 
    
    #创建左上角成组部件
    def createTopLeftGroupBox(self):
        self.topLeftGroupBox = QGroupBox('组 1')
        
        rad1 = QRadioButton('单选按钮1')
        rad2 = QRadioButton('单选按钮2')
        rad3 = QRadioButton('单选按钮3')
        rad1.setChecked(True)
        
        chk = QCheckBox('三态复选按钮')
        chk.setTristate(True)
        chk.setCheckState(Qt.PartiallyChecked)
        
        layout = QVBoxLayout()
        layout.addWidget(rad1)
        layout.addWidget(rad2)
        layout.addWidget(rad3)
        layout.addWidget(chk)
        layout.addStretch(1)
        
        self.topLeftGroupBox.setLayout(layout)
        
    #创建右上角成组部件
    def createTopRightGroupBox(self):
        self.topRightGroupBox = QGroupBox('组 2')
        
        btnDefault = QPushButton('Push Button:缺省模式')
        btnDefault.setDefault(True)
        
        btnToggle = QPushButton('Push Button: 切换模式')
        btnToggle.setCheckable(True)
        btnToggle.setChecked(True)
        
        btnFlat = QPushButton('Push Button: 扁平外观')
        btnFlat.setFlat(True)
        
        layout = QVBoxLayout()
        layout.addWidget(btnDefault)
        layout.addWidget(btnToggle)
        layout.addWidget(btnFlat)
        layout.addStretch(1)
        
        self.topRightGroupBox.setLayout(layout)
        
        
    #创建左下角Tab控件
    def createBottomLeftTabWidget(self):
        self.bottomLeftTabWidget = QTabWidget()
        self.bottomLeftTabWidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Ignored)
        
        tab1 = QWidget()
        tableWidget = QTableWidget(10, 10)  #10行10列
        
        tab1Layout = QHBoxLayout()
        tab1Layout.setContentsMargins(5,5,5,5)
        tab1Layout.addWidget(tableWidget)
        tab1.setLayout(tab1Layout)
        
        tab2 = QWidget()
        textEdit = QTextEdit()
        textEdit.setPlainText("一闪一闪小星星,\n"
                              "我想知道你是什么.\n" 
                              "在整个世界之上, 如此的高,\n"
                              "像在天空中的钻石.\n"
                              "一闪一闪小星星,\n" 
                              "我多想知道你是什么!\n")
        
        tab2Layout = QHBoxLayout()
        tab2Layout.setContentsMargins(5, 5, 5, 5)
        tab2Layout.addWidget(textEdit)
        tab2.setLayout(tab2Layout)
        
        tab3 = QWidget()
        calendar = QCalendarWidget()
        #设置最小日期
        calendar.setMinimumDate(QDate(1900,1,1))
        #设置最大日期
        calendar.setMaximumDate(QDate(4046,1,1))
        #设置网格可见
        calendar.setGridVisible(True)
        tab3Layout = QHBoxLayout()
        tab3Layout.setContentsMargins(5, 5, 5, 5)
        tab3Layout.addWidget(calendar)
        tab3.setLayout(tab3Layout)
        
        self.bottomLeftTabWidget.addTab(tab1, '表格(&T)')
        self.bottomLeftTabWidget.addTab(tab2, '文本编辑(&E)')
        self.bottomLeftTabWidget.addTab(tab3, '日历(&C)')
        
        #self.bottomLeftTabWidget.addTab(tab1, '表格(&T)')
        #self.bottomLeftTabWidget.addTab(tab2, '文本编辑(&E)')
        
        
    #创建右下角成组部件
    def createBottomRightGroupBox(self):
        self.bottomRightGroupBox = QGroupBox('组 3')
        self.bottomRightGroupBox.setCheckable(True)
        self.bottomRightGroupBox.setChecked(True)
        
        lineEdit = QLineEdit('s3cRe7')
        lineEdit.setEchoMode(QLineEdit.Password)
        
        spinBox = QSpinBox(self.bottomRightGroupBox)
        spinBox.setValue(50)
        
        dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)
        dateTimeEdit.setDateTime(QDateTime.currentDateTime())
        
        slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)
        slider.setValue(40)
        
        scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)
        scrollBar.setValue(60)
        
        dial = QDial(self.bottomRightGroupBox)
        dial.setValue(30)
        dial.setNotchesVisible(True)
        
        layout = QGridLayout()
        layout.addWidget(lineEdit, 0, 0, 1, 2)  #0行0列,占1行2列
        layout.addWidget(spinBox, 1, 0, 1, 2)   #1行0列,占1行2列
        layout.addWidget(dateTimeEdit, 2, 0, 1, 2) #2行0列,占1行2列
        layout.addWidget(slider, 3, 0)  #3行0列,占1行1列
        layout.addWidget(scrollBar, 4, 0) #4行0列,占1行1列
        layout.addWidget(dial, 3, 1, 2, 1)  #3行1列,占2行1列
        layout.setRowStretch(5, 1)
        
        self.bottomRightGroupBox.setLayout(layout)
          
    #禁止窗口上的组件
    def setWidgetsDisbaled(self, disable):
        self.topLeftGroupBox.setDisabled(disable)
        self.topRightGroupBox.setDisabled(disable)
        self.bottomLeftTabWidget.setDisabled(disable)
        self.bottomRightGroupBox.setDisabled(disable)
        
    #创建进度条
    def createProgressBar(self):
        self.progressBar = QProgressBar()
        self.progressBar.setRange(0, 10000)
        self.progressBar.setValue(0)
        
        # 定时器,定时更新进度条的值
        timer = QTimer(self)
        timer.timeout.connect(self.advanceProgressBar)
        timer.start(100)
        
    #设置进度条的值        
    def advanceProgressBar(self):
        curVal = self.progressBar.value()
        maxVal = self.progressBar.maximum()
        self.progressBar.setValue(curVal + (maxVal - curVal)//100)
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DarkStyleSheetDemo()
    
    #设置样式表
    app.setStyleSheet(qdarkstyle.load_stylesheet())
    
    window.show()
    sys.exit(app.exec())   

运行效果如下图:

实战PyQt5:112-开源QSS样式表qdartstyle

测试QDarkStyleSheet

本文知识点

  • 安装QDarkStyleSheet开发包
  • 下载QDarkStyleSheet最新版本的源代码
  • 使用QDarkStyleSheet更改程序外观

前一篇: 实战PyQt5: 111-可以使用QSS样式表的部件

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值