26 设置样式
《PyQt5快速开发与实战》学习笔记。
16.1 为标签添加背景图片
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton
import sys
class WindowDemo(QWidget):
def __init__(self):
super().__init__()
#1
label1 = QLabel(self)
label1.setToolTip('这是一个文本标签')
label1.setStyleSheet("QLabel{border-image: url(./images/python.jpg);}")
label1.setFixedWidth(476)
label1.setFixedHeight(259)
#2
btn1 = QPushButton(self)
btn1.setObjectName('btn1')
btn1.setMaximumSize(48, 48)
btn1.setMinimumSize(48, 48)
style = '''
#btn1{
border-radius: 4px;
background-image: url('./images/add.png');
}
#btn1:Pressed{
background-image: url('./images/addhover.png');
}
'''
btn1.setStyleSheet(style)
#3
vbox = QVBoxLayout()
vbox.addWidget(label1)
vbox.addStretch()
vbox.addWidget(btn1)
self.setLayout(vbox)
self.setWindowTitle("按钮和Label添加背景图片例子")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = WindowDemo()
win.show()
sys.exit(app.exec_())
效果如下:
26.2 为按钮添加背景图片
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton
import sys
class WindowDemo(QWidget):
def __init__(self):
super().__init__()
#1
label1 = QLabel(self)
label1.setToolTip('这是一个文本标签')
label1.setStyleSheet("QLabel{border-image: url(./images/python.jpg);}")
label1.setFixedWidth(476)
label1.setFixedHeight(259)
#2
btn1 = QPushButton(self)
btn1.setObjectName('btn1')
btn1.setMaximumSize(64, 64)
btn1.setMinimumSize(64, 64)
style = '''
#btn1{
border-radius: 30px;
background-image: url('./images/left.png');
}
#btn1:hover{
border-radius: 30px;
background-image: url('./images/leftHover.png');
}
#btn1:Pressed{
border-radius: 30px;
background-image: url('./images/leftPressed.png');
}
'''
btn1.setStyleSheet(style)
#3
vbox = QVBoxLayout()
vbox.addWidget(label1)
vbox.addStretch()
vbox.addWidget(btn1)
self.setLayout(vbox)
self.setWindowTitle("按钮和Label添加背景图片例子")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = WindowDemo()
win.show()
sys.exit(app.exec_())
效果如下:
上面的样式对所有的 QPushButton 都有效。如果需要为指定按钮设置背景图片,应该怎么做呢?
需要调用QPushButton对象的setObjectName()函数,为按钮对象设置一个名字,在QSS样式中设置了按钮的三种状态(正常按钮状态、鼠标悬停在按钮上的状态、按下按钮的状态)的背景图。核心代码如下:
26.3 缩放图片
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import Qt
import sys
class WindowDemo(QWidget):
def __init__(self):
super().__init__()
filename = r".\images\Cloudy_72px.png"
img = QImage(filename)
label1 = QLabel(self)
label1.setFixedWidth(120)
label1.setFixedHeight(120)
result = img.scaled(label1.width(), label1.height(),
Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
label1.setPixmap(QPixmap.fromImage(result))
#3
vbox = QVBoxLayout()
vbox.addWidget(label1)
self.setLayout(vbox)
self.setWindowTitle("图片大小缩放例子")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = WindowDemo()
win.show()
sys.exit(app.exec_())
效果如下:
4 设置窗口透明
如果窗口是透明的,那么通过窗口就能看到桌面的背景。要想实现窗口的透明效果,那么就需要设置窗口的透明度,核心代码如下:
win=QMainWindow()
win.setWindowOpacity(0.5)
透明度取值范围为:0.0(全透明)~ 1.0(不透明),默认值为1.0。
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
win = QMainWindow()
win.setWindowTitle("窗口的透明度设置")
win.setWindowOpacity(0.5)
win.resize(350, 250)
win.show()
sys.exit(app.exec_())
效果如下:
26.4 加载 QSS
在 Qt 中经常需要使用样式,为了降低耦合性(与逻辑代码分离),我们通常会定义一个QSS文件,然后编写各种控件(如QLable、QLineEdit、QPushButton)的样式,最后使用 QApplication 或 QMainWindow 来加载样式,这样就可以让整个应用程序共享同一种样式了。
1.编写QSS
首先新建一个扩展名为 .qss
的文件,如 style.qss
,然后将其加入资源文件(.qrc
)中。在 style.qss
文件中编写样式代码,例如:
MainWindow{
border-image:url(../Images/python.jpg);
}
QToolTip{
border: 1px solid #2D2D2D;
background: white;
color: red;
}
2.加载QSS
为了方便以后调用,可以编写一个加载样式的公共类 CommonHelper:
# -*- coding: utf-8 -*-
class CommonHelper :
def __init__(self ) :
pass
@staticmethod
def readQss( style):
with open( style , 'r') as f:
return f.read()
然后在主函数中进行加载。本例文件名为 loadQss.py,其核心代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QVBoxLayout, QPushButton
from CommonHelper import CommonHelper
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.resize(477, 258)
self.setWindowTitle("加载QSS文件")
btn1 = QPushButton(self)
btn1.setText('添加')
btn1.setToolTip('测试提示')
vbox = QVBoxLayout()
vbox.addWidget(btn1)
self.setLayout(vbox)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MainWindow()
styleFile = './style.qss'
qssStyle = CommonHelper.readQss(styleFile)
win.setStyleSheet(qssStyle)
win.show()
sys.exit(app.exec_())
在换肤时需要进行全局修改,只需使用 CommonHelper.readQss()
读取不同的 QSS 文件即可。