QSS样式表支持各种部件,属性,伪状态和子控件,从而可以实现定制部件的外观,下面我们将详细列出可以使用QSS样式表的部件:
可以使用:: up-button和:: up-arrow子控件设置向上按钮和箭头的样式。默认情况下,向上按钮位于小部件的“填充”矩形的右上角。如果没有明确的尺寸,则它占据其参考矩形高度的一半。向上箭头放置在向上按钮的“内容”矩形的中心。
可以使用::down-button和::down-arrow子控件设置向下按钮和箭头的样式。默认情况下,向下按钮位于小部件的“填充”矩形的右下角。如果没有明确的尺寸,则它占据其参考矩形高度的一半。底部箭头位于底部按钮的“内容”矩形的中心。
可以使用border属性设置停靠窗口小部件边框的样式。::title子控件可以用于自定义标题栏。
关闭按钮和浮动按钮分别使用相对于::title子控件的::close-button和::float-button来进行定位。标题栏为垂直时,
当标题栏垂直时,需要设置:vertical伪状态。另外,根据
QDockWidget.DockWidgetFeature设置:closable,:floatable和:movable pseudo状态。
注意:使用QMainWindow :: separator设置调整大小句柄(handle)的样式。
警告:取消QDockWidget时,样式表无效,因为Qt退出时,Qt使用本机顶级窗口。
当前所选条目的的颜色和背景,可以使用selection-color和
selection-background-color属性来设置。
选择行为由show-decoration-selected属性控制。
使用::item子控件可以更精细地控制QListView中的条目。
演示加载qss文件的方法。这里仅列出py文件代码,完整资源可从网络上下载。完整代码如下:
import sys
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)
import resource_rc
#标记控制窗口
class LoadQssDemo(QMainWindow):
def __init__(self):
super(LoadQssDemo, self).__init__()
# 设置窗口标题
self.setWindowTitle('实战PyQt5: 加载QSS样式表文件')
#应用的初始调色板
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)
#这里加载一个QSS文件
self.loadStyleSheet()
#菜单栏设置
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)
#关键代码!!!!!!
def loadStyleSheet(self):
file = QFile(':/qdarkstyle/qdarkstyle.qss')
file.open(QFile.ReadOnly)
styleSheet = file.readAll()
styleSheet = str(styleSheet, encoding='utf8')
file.close()
QApplication.instance().setStyleSheet(styleSheet)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = LoadQssDemo()
window.show()
sys.exit(app.exec())
运行结果如下图:
加载QSS文件
联系客服