一、设置样式的方式
1.可通过setStyleSheet设置样式,如下
label1.setStyleSheet("QWidget{background-color:#e1dfdf;border:1px solid black; height:34px; }")
如果设置的样式较多,会使代码看起来繁琐冗余。
2.采用QSS样式表
QSS样式表 类似于CSS,
创建.qss文件,常用的有以下几种类型
/* 通配符选择器,用于共性样式设置,作用于所有控件 */
*{
color: black;
font-size: 12pt;
font-weight: 100;
font-family: Microsoft YaHei;
}
/* 类型选择器,即控件类型,作用于指定类控件及其子类控件 */
/* QAbsractButton为按钮控件 */
QAbsractButton{
background-color: pink;
}
/* 类选择器,即控件类,作用于指定类控件 */
.QPushButton{
background-color: #f7f0fe;
width:100px;
height: 30px;
margin: 15px 200px;
}
.QLabel{
margin: 0 200px;
}
/* 名称选择器,通过setObjectName(name_str)设置控件名称,作用于指定名称的控件(注意名称不唯一,不同控件可有相同名称) */
#btn1{
background-color: #fef6f0;
}
/* 同上 */
QPushButton#btn2{
background-color: #f0fefe;
}
/* 属性选择器,作用于指定“属性名”或“属性名和值”的控件 */
.QLabel[attrName]{
color: blue;
}
.QLabel[attrName='result_right']{
color: red;
}
/* 所属选择器,作用于所属某父控件的控件(所属关系可直接即父子,可间接如爷孙 */
QDialog#quest1 QPushButton{
color: black;
width:50px;
height: 30px;
amrgin: 0
background-color: red;
}
/* 子选择器,作用于所属某父控件的控件(所属关系是父子) */
QDialog#quest1>QPushButton{
color: black;
width:50px;
height: 30px;
amrgin: 0
background-color: red;
}
/* 元素选择器,作用于复合控件的指定子元素。其中相关元素参数是固定的 */
QComboBox::dropdown{
background-color:yellow;
}
/* 多选择器,逗号分割 */
QLabel,#btn1{
background-color:yellow;
}
在py文件中的调用方式为:
with open('mainStyle.qss', 'r', encoding='utf-8') as f: result = f.read() app.setStyleSheet(result)
二、参考示例:
将如上qss文件命名为mainStyle.qss,放在py文件的同级目录下
import sys, os
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow, QHBoxLayout, QPushButton, QWidget, QVBoxLayout, \
QTextEdit, QDialogButtonBox, QLabel, QMessageBox, QRadioButton
class MyWin(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('答题')
self.resize(600,400)
self.setUI()
def setUI(self):
self.w = QWidget()
self.layout = QVBoxLayout(self.w)
self.setCentralWidget(self.w)
self.singleC = QPushButton('单选题')
self.question = singleQuestionDialog()
self.question.resize(300,200)
self.question.setObjectName('quest1')
self.singleC.clicked.connect(self.question.open)
self.multipC = QPushButton('多选题')
self.multipC.setObjectName('btn1')
self.chargeC = QPushButton('判断题')
self.chargeC.setObjectName('btn2')
self.label1 = QLabel('答对')
self.label1.setProperty('attrName', 'result_right')
self.label2 = QLabel('答错')
self.label2.setProperty('attrName', 'result_eror')
# self.w2 = QWidget()
# self.w2_layout = QHBoxLayout(self.w2)
# self.btn_commit = QPushButton('确定')
# self.btn_cacel = QPushButton('取消')
# self.w2_layout.addStretch()
# self.w2_layout.addWidget(self.btn_commit)
# self.w2_layout.addWidget(self.btn_cacel)
# self.w2_layout.addStretch()
self.layout.addStretch(2)
self.layout.addWidget(self.singleC)
self.layout.addWidget(self.multipC)
self.layout.addWidget(self.chargeC)
self.layout.addWidget(self.label1)
self.layout.addWidget(self.label2)
# self.layout.addWidget(self.w2)
self.layout.addStretch(3)
def singleQuestion(self):
self.question = singleQuestionDialog()
self.show()
class singleQuestionDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("单选题")
self.resize(100,200)
QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel
# connect buttons to slots to set result value of the dialog
self.buttonBox = QDialogButtonBox(QBtn)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
self.layout = QVBoxLayout()
self.message = QLabel("单选题1:请选出一个你认为正确的答案?")
self.answerA = QRadioButton('A. 选项A')
self.answerB = QRadioButton('B. 选项B')
self.answerC = QRadioButton('C. 选项C')
self.layout.addWidget(self.message)
self.layout.addWidget(self.answerA)
self.layout.addWidget(self.answerB)
self.layout.addWidget(self.answerC)
self.layout.addWidget(self.buttonBox)
self.setLayout(self.layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
# 应用样式表
with open('mainStyle.qss', 'r', encoding='utf-8') as f:
result = f.read()
app.setStyleSheet(result)
myWin = MyWin()
myWin.show()
sys.exit(app.exec_())