PyQt5 是一个强大的Python库,用于创建图形用户界面(GUI)。其中,QLabel 控件作为一个简单而实用的组件,经常用于显示文本、图像,甚至可以创建带有超链接的标签。这篇博客中将介绍 QLabel 控件的各种功能和用法,帮助您更好地利用这个神奇的控件。
什么是QLabel?
QLabel 是 PyQt5 中的一个基本控件,主要用于在用户界面中显示静态文本或图像。它不仅可以用于简单的文本显示,还支持富文本、图像展示、超链接等功能。
创建第一个QLabel
让我们从一个简单的例子开始,创建一个基本的 QLabel 控件:
import sys
from PyQt5.QtWidgets import QLabel, QWidget,QApplication
app = QApplication(sys.argv)
w=QWidget()
w.setGeometry(300,300,300,300)
label = QLabel('Hello, QLabel!',w)
w.show()
sys.exit(app.exec_())
在窗口中创建QLabel控件的方式主要有两种,第一种是***直接将QLabel作为窗口的子部件***label = QLabel('Hello, QLabel!',w)
;第二种是***使用布局管理器***,先将QLabel控件添加到布局中,然后将布局添加给窗口。
#创建窗口
window = QWidget()
# 创建QLabel
label = QLabel('Hello, QLabel!')
# 创建布局管理器并将QLabel添加到布局中
layout = QVBoxLayout(window)
layout.addWidget(label)
- 程序预览
QLabel的基本用途
文本显示
使用 QLabel 可以轻松地显示文本,并且可以通过设置字体、颜色等属性进行自定义。在下面的示例中,我们设置了一个带有红色字体的文本标签:
self.label1 = QLabel(self)
self.label1.setText('<font color=red>这是一个文本控件</font>')
self.label1.setAutoFillBackground(True)
palette = QPalette()
palette.setColor(QPalette.Window, Qt.blue)
self.label1.setPalette(palette)
self.label1.setAlignment(Qt.AlignCenter)
创建了一个 QPalette 对象palette,将窗口(QPalette.Window)的颜色设置为蓝色,然后将该调色板应用到 self.label1。这样做可以修改 QLabel 的背景颜色,使其呈现为蓝色。
图像显示
QLabel 也可以用于显示图像。下面的代码演示了如何加载一张图像,并在 label2 中显示:
self.label2 = QLabel(self)
pixmap = QPixmap('./imgs/python.png')
new_pixmap = pixmap.scaled(self.label2.width(), self.label2.height())
self.label2.setPixmap(new_pixmap)
self.label2.setAlignment(Qt.AlignCenter)
在这个示例中,加载了一张图像,并使用 scaled 方法将图像缩放到 label2 的大小,然后将其设置为 QLabel 的内容。这里需要注意scaled是不会改变原来图形的,所以这里用new_pixmap接收缩放后的图片。
超链接
QLabel 支持显示超链接文本,并且可以通过连接信号来处理链接的悬停和点击事件。下面的代码展示了两个带有超链接的 QLabel:
self.label3 = QLabel(self)
self.label3.setText("<a href='#'>这是另一个文本控件</a>")
self.label4 = QLabel(self)
self.label4.setText("<a href='https://u.jd.com/HQ7HbhJ'>Python Qt GUI与数据可视化编程 pyqt5 教程书籍</a>")
在这个例子中,label3 的超链接指向页面内的锚点(#),而 label4 的超链接指向外部网址。还可以连接相应的槽函数来处理链接的悬停和点击事件:
self.label3.linkHovered.connect(self.on_linkHovered)
self.label4.linkActivated.connect(self.on_linkActivated)
信号处理
QLabel控件有两个信号linkHovered和linkActivated。用户点击了带有超链接的文本时触发linkActivated信号,鼠标悬停在带有超链接的文本上时触发linkHovered信号
链接的地址会作为槽函数的参数传递,帮助文档是C++的,python应该也一样
def on_linkActivated(self,link):
print(f"Link Activated: {link}")
def on_linkHovered(self,link):
print(f"link Hovered:{link}")
在这里,当用户悬停在超链接上时,on_linkHovered 方法会被调用;而当用户点击超链接时,on_linkActivated 方法会被调用,并传递链接地址作为参数。
- 程序预览
顺便提一下,label4上的链接是可以打开的,只要加上这行代码self.label4.setOpenExternalLinks(True)
使用 StyleSheet 设定 QLabel 样式
Qt样式表(Qt Style Sheets,QSS)是一种类似于 CSS(Cascading Style Sheets)的样式表语言,用于定义Qt应用程序中控件的外观和风格
self.label5.setText('这是设置了QSS的文本控件')
self.label5.setStyleSheet('''
background:#fff;
color:#f00;
font-size:20px;
font-weight:bold;
border:2px dashed #000;
padding:20px;
text-align:center;
''')
这段QSS样式的含义如下:
background: #fff; 设置背景颜色为白色。
color: #f00; 设置文本颜色为红色。
font-size: 20px; 设置字体大小为20像素。
font-weight: bold; 设置字体加粗。
border: 2px dashed #000; 设置2像素宽度的黑色虚线边框。
padding: 20px; 设置内边距为20像素。
text-align: center; 设置文本居中对齐。
- 程序预览
代码
import sys
from PyQt5.QtWidgets import QWidget, QApplication,QLabel,QVBoxLayout
from PyQt5.QtGui import QPalette,QPixmap
from PyQt5.QtCore import Qt
class QLabelDemo(QWidget):
def __init__(self):
super(QLabelDemo, self).__init__()
self.initUI()
def initUI(self):
self.setFixedSize(400,300)
self.label1=QLabel(self)
self.label2=QLabel(self)
self.label3=QLabel(self)
self.label4=QLabel(self)
self.label5=QLabel(self)
self.label1.setText('<font color=red>这是一个文本控件</font>')
self.label1.setAutoFillBackground(True)
palette=QPalette()
palette.setColor(QPalette.Window,Qt.blue)
self.label1.setPalette(palette)
self.label1.setAlignment(Qt.AlignCenter)
pixmap=QPixmap('./imgs/python.png')
new_pixmap=pixmap.scaled(self.label2.width(),self.label2.height())#scaled doesn't modify the original QPixmap
self.label2.setPixmap(new_pixmap)
self.label2.setAlignment(Qt.AlignCenter)
self.label3.setText("<a href='#'>这是另一个文本控件</a>")
self.label4.setText("<a href='https://u.jd.com/HQ7HbhJ'>Python Qt GUI与数据可视化编程 pyqt5 教程书籍</a>")
# self.label4.setOpenExternalLinks(True)
self.label5.setText('这是设置了QSS的文本控件')
self.label5.setStyleSheet('''
background:#fff;
color:#f00;
font-size:20px;
font-weight:bold;
border:2px dashed #000;
padding:20px;
text-align:center;
''')
vlayout=QVBoxLayout(self)
vlayout.addWidget(self.label1)
vlayout.addWidget(self.label2)
vlayout.addWidget(self.label3)
vlayout.addWidget(self.label4)
vlayout.addWidget(self.label5)
self.label3.linkHovered.connect(self.on_linkHovered)
self.label4.linkActivated.connect(self.on_linkActivated)
def on_linkActivated(self,link):
print(f"Link Activated: {link}")
def on_linkHovered(self,link):
print(f"link Hovered:{link}")
if __name__=='__main__':
app=QApplication(sys.argv)
demo=QLabelDemo()
demo.show()
sys.exit(app.exec_())