当前位置: 首页 > ai >正文

PyQt5—QLabel 学习笔记

第二章 控件学习


        QLabel 是 Qt 框架中最基础也最常用的组件之一,主要用于显示文本或图像。它看似简单,却有很多实用功能,比如显示富文本、设置对齐方式、添加链接等。下面从基础开始,一步步带你掌握 QLabel 的用法。

1. 最简单的 QLabel 示例

先从最基础的代码开始,创建一个显示文本的标签:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayoutclass LabelDemo(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建布局layout = QVBoxLayout(self)# 创建标签label = QLabel("这是一个简单的标签", self)# 添加标签到布局layout.addWidget(label)# 设置窗口属性self.setWindowTitle("QLabel 基础示例")self.setGeometry(300, 300, 300, 100)self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = LabelDemo()sys.exit(app.exec_())

代码解读:

  • QLabel 的构造方法很简单,直接传入要显示的文本和父窗口即可
  • 这里用 QVBoxLayout 布局来放置标签,让它在窗口中居中显示
  • setGeometry 方法设置窗口位置(300,300)和大小(300x100)

运行后会看到一个窗口,中间显示 "这是一个简单的标签" 文字,这就是 QLabel 最基本的用法。

2. 设置文本对齐方式和样式

QLabel 可以通过样式表设置字体、颜色等,还能调整文本对齐方式:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtCore import Qtclass LabelStyleDemo(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):layout = QVBoxLayout(self)# 左对齐标签label1 = QLabel("左对齐文本", self)label1.setAlignment(Qt.AlignLeft)  # 左对齐label1.setStyleSheet("font-size: 14px; color: blue;")  # 蓝色14号字# 居中对齐标签label2 = QLabel("居中对齐的粗体文本", self)label2.setAlignment(Qt.AlignCenter)  # 居中对齐label2.setStyleSheet("font-size: 16px; font-weight: bold; color: red;")  # 红色粗体16号字# 右对齐标签label3 = QLabel("右对齐并添加背景色", self)label3.setAlignment(Qt.AlignRight)  # 右对齐label3.setStyleSheet("""font-size: 12px; background-color: lightgray; padding: 5px; border: 1px solid gray;""")  # 带背景和边框的样式# 添加到布局layout.addWidget(label1)layout.addWidget(label2)layout.addWidget(label3)self.setWindowTitle("QLabel 样式示例")self.setGeometry(300, 300, 300, 200)self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = LabelStyleDemo()sys.exit(app.exec_())

代码解读:

  • setAlignment 方法设置对齐方式,常用的有 Qt.AlignLeft(左对齐)、Qt.AlignCenter(居中)、Qt.AlignRight(右对齐)
  • setStyleSheet 用 CSS 语法设置样式,比如字体大小、颜色、背景色等
  • 布局会自动按顺序排列标签,每个标签根据自身样式显示

这个例子能直观看到不同样式和对齐方式的效果,QLabel 的样式灵活性很高,基本能满足各种界面需求。

3. 显示图像和动态图片

QLabel 不仅能显示文本,还能显示图片和动态 GIF:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout
from PyQt5.QtGui import QPixmap, QMovie  # 引入QMovie类
from PyQt5.QtCore import Qt  # 引入Qt类class LabelImageDemo(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):layout = QHBoxLayout(self)# 显示静态图片img_label = QLabel(self)pixmap = QPixmap("image.jpg")  # 替换为你的图片路径if not pixmap.isNull():# 按比例缩放图片适应标签scaled_pixmap = pixmap.scaled(img_label.width(),img_label.height(),Qt.KeepAspectRatio,  # 保持比例Qt.SmoothTransformation  # 平滑缩放)img_label.setPixmap(scaled_pixmap)else:img_label.setText("图片加载失败")# 显示动态GIFgif_label = QLabel(self)# 创建QMovie对象并设置GIF路径movie = QMovie("animation.gif")  # 替换为你的GIF路径gif_label.setMovie(movie)movie.start()  # 开始播放# 添加到布局layout.addWidget(img_label)layout.addWidget(gif_label)self.setWindowTitle("QLabel 图像示例")self.setGeometry(300, 300, 500, 300)self.show()# 窗口大小改变时重新缩放图片def resizeEvent(self, event):# 获取第一个标签(图片标签)if self.layout().count() > 0:img_label = self.layout().itemAt(0).widget()if isinstance(img_label, QLabel) and img_label.pixmap():# 重新缩放图片scaled_pixmap = img_label.pixmap().scaled(img_label.width(),img_label.height(),Qt.KeepAspectRatio,Qt.SmoothTransformation)img_label.setPixmap(scaled_pixmap)super().resizeEvent(event)if __name__ == '__main__':app = QApplication(sys.argv)ex = LabelImageDemo()sys.exit(app.exec_())

代码解读:

  • 显示静态图片用 setPixmap 方法,需要先创建 QPixmap 对象加载图片
  • scaled 方法缩放图片,Qt.KeepAspectRatio 确保不拉伸变形
  • 显示 GIF 用 setMovie 方法,调用 start() 开始播放,stop() 可以停止
  • 重写 resizeEvent 方法,让窗口大小改变时图片也能自适应缩放

注意:如果图片路径错误,QPixmap.isNull() 会返回 True,这时可以显示提示文本,避免界面空白。

4. 显示富文本和超链接

QLabel 支持 HTML 格式的富文本,还能设置可点击的超链接:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtGui import QDesktopServicesclass LabelRichTextDemo(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):layout = QVBoxLayout(self)# 富文本标签rich_label = QLabel(self)rich_label.setText("""<h3>这是富文本示例</h3><p>可以显示 <b>粗体</b>、<i>斜体</i>、<u>下划线</u> 文本</p><p>还能设置不同 <span style="color: red; font-size: 14px;">颜色</span> 和 <span style="font-size: 16px;">大小</span></p>""")rich_label.setWordWrap(True)  # 自动换行# 超链接标签link_label = QLabel(self)link_label.setText('<a href="https://www.qt.io">Qt 官方网站</a>')link_label.setOpenExternalLinks(False)  # 禁用自动打开,用自定义处理link_label.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextBrowserInteraction)link_label.linkActivated.connect(self.openLink)  # 链接点击事件layout.addWidget(rich_label)layout.addWidget(link_label)self.setWindowTitle("QLabel 富文本示例")self.setGeometry(300, 300, 300, 200)self.show()def openLink(self, url):# 自定义处理链接点击,打开系统浏览器QDesktopServices.openUrl(QUrl(url))print(f"打开链接: {url}")if __name__ == '__main__':app = QApplication(sys.argv)ex = LabelRichTextDemo()sys.exit(app.exec_())

代码解读:

  • 富文本用 HTML 标签编写,通过 setText 设置,setWordWrap(True) 让文本自动换行
  • 超链接用 <a href="url">文本</a> 格式,setOpenExternalLinks(False) 禁用默认打开方式
  • linkActivated 信号在链接被点击时触发,连接到自定义方法处理(比如打开浏览器)
  • setTextInteractionFlags 设置文本可被鼠标选中,让链接看起来更像可点击状态

这种方式可以在标签中实现复杂的文本排版,甚至简单的图文混排,适合显示说明文字或帮助信息。

5. QLabel 常用方法总结

方法功能描述
setText(text)设置显示的文本
text()获取当前显示的文本
setPixmap(pixmap)设置显示的图片
pixmap()获取当前显示的图片
setMovie(movie)设置显示的动态图
setAlignment(alignment)设置对齐方式(如 Qt.AlignCenter)
setStyleSheet(style)设置 CSS 样式
setWordWrap(flag)设置是否自动换行(True/False)
setScaledContents(flag)设置图片是否自适应标签大小(True 可能变形)
setOpenExternalLinks(flag)设置是否自动打开链接
linkActivated.connect(slot)链接被点击时触发的信号

6. 综合示例:带选择功能的图片标签

下面结合 QLabel 和 QRubberBand,实现一个可以在图片上框选区域的功能:

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel, QPushButton,QVBoxLayout, QHBoxLayout, QWidget, QSlider,QFileDialog, QMessageBox)
from PyQt5.QtGui import QPixmap, QMovie, QFont, QColor, QPalette, QCursor
from PyQt5.QtCore import Qt, QUrl, QSizeclass LabelDemo(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):# 设置主窗口self.setWindowTitle('QLabel 综合案例')self.setGeometry(300, 300, 800, 600)# 创建中央部件和布局central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)# === 文本标签 ===text_label = QLabel('Hello <b>QLabel</b>!', self)text_label.setFont(QFont('SimHei', 16))  # 设置中文字体text_label.setAlignment(Qt.AlignCenter)text_label.setToolTip('这是一个富文本标签')main_layout.addWidget(text_label)# === 图片标签 ===self.image_label = QLabel(self)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setMinimumSize(400, 300)self.image_label.setStyleSheet("border: 1px solid #ccc;")self.image_label.setText("点击下方按钮加载图片")main_layout.addWidget(self.image_label)# === 动图标签 ===self.gif_label = QLabel(self)self.gif_label.setAlignment(Qt.AlignCenter)self.gif_label.setMinimumHeight(100)main_layout.addWidget(self.gif_label)# === 按钮区域 ===btn_layout = QHBoxLayout()# 加载图片按钮load_img_btn = QPushButton('加载图片', self)load_img_btn.clicked.connect(self.load_image)btn_layout.addWidget(load_img_btn)# 加载动图按钮load_gif_btn = QPushButton('加载动图', self)load_gif_btn.clicked.connect(self.load_gif)btn_layout.addWidget(load_gif_btn)# 切换文本按钮toggle_text_btn = QPushButton('切换文本样式', self)toggle_text_btn.clicked.connect(self.toggle_text_style)btn_layout.addWidget(toggle_text_btn)main_layout.addLayout(btn_layout)# === 滑块控制区域 ===slider_layout = QHBoxLayout()slider_label = QLabel('调整图片大小:', self)slider_layout.addWidget(slider_label)self.size_slider = QSlider(Qt.Horizontal, self)self.size_slider.setRange(50, 200)self.size_slider.setValue(100)self.size_slider.valueChanged.connect(self.resize_image)slider_layout.addWidget(self.size_slider)main_layout.addLayout(slider_layout)# === 状态栏 ===self.statusBar().showMessage('就绪')# 初始化变量self.current_pixmap = Noneself.current_scale = 1.0self.text_mode = 0# 加载默认动图self.load_default_gif()# 显示窗口self.show()def load_image(self):"""加载图片文件"""options = QFileDialog.Options()file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp *.gif);;所有文件 (*)", options=options)if file_name:self.current_pixmap = QPixmap(file_name)self.display_image()self.statusBar().showMessage(f'已加载图片: {file_name}')def load_gif(self):"""加载GIF动画"""options = QFileDialog.Options()file_name, _ = QFileDialog.getOpenFileName(self, "选择GIF动图", "", "GIF文件 (*.gif);;所有文件 (*)", options=options)if file_name:movie = QMovie(file_name)if movie.isValid():self.gif_label.setMovie(movie)movie.start()self.statusBar().showMessage(f'已加载动图: {file_name}')else:QMessageBox.warning(self, "错误", "无法加载动图,请检查文件格式")def load_default_gif(self):"""加载默认的示例动图"""movie = QMovie(":/images/loading.gif")  # 实际项目中应替换为有效路径if movie.isValid():self.gif_label.setMovie(movie)movie.start()else:self.gif_label.setText("无法加载示例动图")def display_image(self):"""显示图片并应用缩放"""if self.current_pixmap:scaled_pixmap = self.current_pixmap.scaled(self.current_pixmap.width() * self.current_scale,self.current_pixmap.height() * self.current_scale,Qt.KeepAspectRatio, Qt.SmoothTransformation)self.image_label.setPixmap(scaled_pixmap)def resize_image(self):"""根据滑块值调整图片大小"""value = self.size_slider.value()self.current_scale = value / 100.0self.display_image()def toggle_text_style(self):"""切换文本显示样式"""self.text_mode = (self.text_mode + 1) % 3if self.text_mode == 0:# 普通文本self.image_label.setText("点击下方按钮加载图片")self.image_label.setStyleSheet("border: 1px solid #ccc;")elif self.text_mode == 1:# 带样式的文本self.image_label.setText("<html><body><center><h3>请选择一张图片</h3><p>支持 PNG, JPG, GIF 等格式</p></center></body></html>")self.image_label.setStyleSheet("border: 2px dashed #aaa; background-color: #f9f9f9;")else:# 清空文本self.image_label.setText("")self.image_label.setStyleSheet("border: 1px solid #ccc;")if __name__ == '__main__':app = QApplication(sys.argv)# 设置应用字体,确保中文正常显示font = QFont("SimHei")app.setFont(font)demo = LabelDemo()sys.exit(app.exec_())

代码解读:

案例功能说明

  1. 文本标签:使用富文本格式显示文本,支持 HTML 标签(如<b>加粗),设置了中文字体和居中对齐。

  2. 图片显示

    • 通过按钮选择并加载本地图片文件
    • 支持图片缩放功能(通过滑块控制)
    • 保持图片原始比例
    • 平滑缩放算法确保图片质量
  3. 动图播放

    • 通过 QMovie 类实现 GIF 动画播放
    • 支持加载本地 GIF 文件
    • 提供默认动图示例
  4. 交互功能

    • 切换文本显示样式(普通文本、HTML 格式文本、清空)
    • 状态栏显示当前操作状态
    • 悬停提示(ToolTip)
  5. 样式定制

    • 使用 QSS(Qt 样式表)设置边框和背景
    • 自定义字体和对齐方式

使用说明

  1. 运行程序后,界面会显示一个文本标签、图片显示区域、动图区域和控制按钮
  2. 点击 "加载图片" 按钮选择本地图片文件进行显示
  3. 使用滑块可以调整图片大小
  4. 点击 "加载动图" 按钮选择 GIF 文件进行播放
  5. 点击 "切换文本样式" 按钮可以改变图片区域的提示文本样式

        这个例子展示了 QLabel 与其他组件结合的用法,比如在图片查看器中框选部分区域进行裁剪,QLabel 作为显示载体,QRubberBand 提供交互功能。

http://www.xdnf.cn/news/15935.html

相关文章:

  • 常用 Flutter 命令大全:从开发到发布全流程总结
  • ELF 文件操作手册
  • Java 动态导出 Word 登记表:多人员、分页、动态表格的最佳实践
  • C++11--锁分析
  • ospf技术
  • 【SpringAI实战】实现仿DeepSeek页面对话机器人
  • Jiasou TideFlow AIGC SEO Agent:全自动外链构建技术重构智能营销新标准
  • 技术与情感交织的一生 (十)
  • Spring处理器和Bean的生命周期
  • LinkedList与链表(单向)(Java实现)
  • 【2025/07/21】GitHub 今日热门项目
  • WinForm-免费,可商用的WinForm UI框架推荐
  • Linux 命令大全
  • Three.js实现银河流光粒子星空特效原理与实践
  • 【Android】交叉编译faiss库 | 问题解决
  • 【HarmonyOS】ArkTS语法详细解析
  • C++ <继承> 详解
  • Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践
  • kafka 生产和消费 性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-test.sh
  • 安装docker可视化工具 Portainer中文版(ubuntu上演示,所有docker通用) 支持控制各种容器,容器操作简单化 降低容器门槛
  • 2025最新版IntelliJ IDEA Ultimate for Mac专业版安装使用指南
  • C#最佳实践:为何应尽量减少静态类的使用
  • 【PTA数据结构 | C语言版】旅游规划
  • WSL如何安装docker?
  • 基于ArcFace损失函数训练的人脸特征提取模型
  • nextjs+react接口会请求两次?
  • UART串口
  • 【Git#6】多人协作 企业级开发模型
  • 多线程Python爬虫:加速大规模学术文献采集
  • 前端之学习后端java小白(一)之SDKMAN及helloword