第五节_PySide6基本窗口控件_主窗口和标签
本文介绍了PySide6中主窗口和标签控件的使用。主要内容包括: 窗口控件分类: QWidget是基础窗口部件,可作为独立窗口或子部件 QMainWindow提供标准应用程序框架,包含菜单栏、工具栏等 QDialog用于对话框,支持模态交互 主窗口创建: 演示了如何创建QMainWindow子类 实现了窗口居中、设置图标、状态栏等功能 提供了窗口几何信息的获取方法 QLabel标签控件: 继承自Q
文章目录
前言
前面四节已详细介绍了PySide6的安装、项目创建、Qt Designer 的基础使用以及EXE可执行文件的打包,后续会用大量章节来详细介绍窗口控件,这是掌握PySide6使用的基础,需要进行耐心的学习。
本节主要介绍基本窗口控件中的 主窗口(QMainWindow/QWidget/QDialog) 和 标签(QLabel)
一、QWidget、QMainWindow 和 QDialog简介
1.继承链关系
首先,从面向对象的角度看,三者的关系非常明确:
QWidget ← QMainWindow / QDialog
这意味着:
1)QMainWindow 和 QDialog 都是 QWidget 的子类。
2)QWidget 是所有用户界面对象的基类。
3)QMainWindow 和 QDialog 是特化的 QWidget,它们继承了 QWidget 的所有功能(如尺寸、位置、可见性、样式等),并添加了自己独有的特性。
注解:可以把 QWidget 理解为一块空白的画布,而 QMainWindow 和 QDialog 则是已经印好不同格式(如信纸、表格)的纸张。
2.QWidget - 基础的窗口部件
定义:所有可视化组件的基类。按钮(QPushButton)、标签(QLabel)、甚至是窗口本身,最终都继承自 QWidget。
1)核心特点:
①基础性:它提供了绘制屏幕和处理用户输入的所有基本功能。
②灵活性:可以作为独立的顶级窗口(window),也可以作为子部件(child widget)嵌入到其他部件中。
③轻量级:没有预定义的菜单栏、工具栏、状态栏等结构。
2)典型用途:
①作为自定义控件(如一个复杂的图表、一个游戏画面)。
②作为子部件嵌入到更大的布局中。
③当需要一个非常简单、没有任何标准界面元素的弹出窗口时。
3.QMainWindow - 应用程序的主窗口
定义:为典型的主应用程序窗口提供了一个框架。它被设计为许多桌面应用程序的中央枢纽。
1)核心特点:
①预定义布局:它拥有一个非常标准且固定的布局结构,包括:
菜单栏(Menu Bar):顶部区域;
工具栏(Tool Bars):可停靠在四周的区域;
中心部件(Central Widget):最重要的区域,放置应用程序的核心内容(如文本编辑器、表格、绘图区等);
停靠部件(Dock Widgets):可停靠在左右两侧的浮动面板(如文件浏览器、工具箱);
状态栏(Status Bar):底部显示状态信息的区域。
②管理便捷:提供了专用的方法(如 menuBar(), addToolBar(), setCentralWidget(), statusBar())来管理和操作这些区域,无需手动布局。
③功能完整:非常适合构建功能复杂的桌面软件(如IDE、图像编辑器、办公软件)。
2)典型用途:
①应用程序的主界面。
②任何需要标准菜单、工具栏和状态栏的窗口
4.QDialog - 对话框窗口
定义:用于短期任务和与用户的简短通信的顶级窗口。
1)核心特点:
①模态性(Modality):这是其最关键的特性:
应用程序模态(Application-Modal):弹出后,阻塞整个应用程序,用户必须先处理该对话框才能与其他窗口交互;----exec()
窗口模态(Window-Modal):只阻塞与之关联的父窗口;
非模态(Non-Modal):弹出后不阻塞任何操作,就像一个小工具窗口。----show()
②标准按钮布局:通常包含 Ok、Cancel、Yes、No、Apply、Close 等标准按钮,可以通过QDialogButtonBox 轻松实现。
③返回值:通过 exec() 方法执行会返回一个结果码(Accepted 或 Rejected),方便判断用户是确认还是取消。
④尺寸通常固定:对话框大小通常由内容决定,用户不太需要调整其大小。
2)典型用途:
①应用程序的主界面。
②任何需要标准菜单、工具栏和状态栏的窗口。
5.总结与选择指南
特性 | QWidget | QMainWindow | QDialog |
---|---|---|---|
角色 | 万金油,基础画布 | 应用程序的“家”和指挥中心 | 临时工,执行特定任务 |
核心功能 | 显示内容,处理输入 | 提供标准应用程序框架 | 模态交互,返回结果 |
布局 | 完全自定义 | 预定义固定区域,只需填充内容 | 通常为简单表单或消息 |
典型用途 | 自定义控件、简单窗口、子部件 | 主界面(IDE、编辑器、浏览器) | 对话框 |
显示方法 | show() | show() | 模态exec()或 非模态show() |
返回值 | 无 | 无 | 有(Accepted/Rejected) |
二、主窗口的介绍和创建
1.主窗口的介绍
窗口控件 QWidget 是所有用户界面对象的基类,所有的窗口和控件都直接或间接继承自QWidget;
一个程序包含一个或多个窗口或控件,必定有一个窗口是其他窗口的父类,将这个窗口称为主窗口(或顶层窗口)。其他窗口或控件继承主窗口,方便对它们进行管理,在需要的时候启动,在不需要的时候删除。主窗口一般是 QMainWindow 的实例,QMainWindow 中用一个控件(QWidget)占位符来占着中心窗口,可以使用 setCentralWidget()函数来设置中心窗口:
2.主窗口的创建
①窗口控件使用原则如下:
1) 如果要嵌入窗口,则使用 QWidget 类;
2)如果是主窗口,则使用 QMainWindow 类;
3)如果是对话框,则使用 QDialog 类。
②按照前面四节内容进行项目创建,和UI界面构建:
③在 Demo01.py 中编写主程序:
import sys
import os
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
from UI.test01_ui import Ui_MainWindow
class MyWindow(QMainWindow): # 这里的继承的父类一定要注意使用你定义UI窗体类型
def __init__(self):
super().__init__()
# 实例化 ui.py 文件中的UI窗体类
self.ui = Ui_MainWindow()
# 使用 Ui_MainWindow 中的 setupUi 方法给当前窗体加载 ui 界面
self.ui.setupUi(self)
# 主窗口居中显示
self.ui.btn_01.clicked.connect(self.center)
# 设置UI界面图标
self.ui.btn_02.clicked.connect(lambda: self.setWindowIcon(QIcon(':/res/Resources/image/5.jpeg')))
# 显示状态栏
self.ui.btn_03.clicked.connect(lambda: self.statusBar().showMessage("这是状态栏提示信息,将在3秒钟后消失", 3000))
# 显示窗口坐标和大小
self.ui.btn_04.clicked.connect(self.show_geometry)
# 关闭主窗口
self.ui.btn_05.clicked.connect(self.close)
def center(self):
# 该行语句用来计算显示屏幕的大小,screen 是一个 QRect 类
screen = QGuiApplication.primaryScreen().geometry()
#该行语句用来获取 QWidget 窗口的大小。size 和 screen 一样,也是一个 QRect 类
size = self.geometry()
#该行语句用来将窗口移到屏幕中间 '//'代表取整除
self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
def show_geometry(self):
print('主窗口坐标信息,相对于屏幕')
print('主窗口: x={}, y={}, width={}, height={}:'.format(self.x(),self.y(),self.width(),self.height()))
print('主窗口geometry: x={}, y={}, width={}, height={}:'.format(self.geometry().x(),self.geometry().y(),self.geometry().width(),self.geometry().height()))
print('主窗口frameGeometry: x={}, y={}, width={}, height={}:'.format(self.frameGeometry().x(),self.frameGeometry().y(),self.frameGeometry().width(),self.frameGeometry().height()))
if __name__ == "__main__":
app = QApplication(sys.argv)
#设置UI界面的图标,使用:/来引用资源文件
#app.setWindowIcon(QIcon(':/res/Resources/image/5.jpeg'))
windows = MyWindow()
windows.show()
sys.exit(app.exec())
三、标签 QLabel 简介
1.继承链关系
QLabel 是界面中的标签类,继承自 QFrame:
2.QLabel 是什么?
QLabel 是一个用于显示 文本 或 图片 的控件。它是用户界面的基石,主要用于:
1)信息展示:向用户显示只读信息、提示或标题。
2)图片呈现:显示图标、徽标或图像内容。
3)间接交互:作为其他控件的“伙伴”(Buddy),提供快捷键焦点和描述。
其核心特点是 通常不接受用户输入(只读),但支持丰富的显示格式和部分交互。
3.核心功能与特性
①文本显示(核心功能)
QLabel 可以显示三种类型的文本内容,处理方式各不相同:
文本类型 | 设置方法 | 特点 | 适用场景 |
---|---|---|---|
纯文本 | setText(“简单文本”) | 不解析HTML标签,原样显示。性能最佳。 | 显示简单的提示、标签、标题。 |
富文本 | setText(“粗体文本”) | 解析有限的HTML子集,支持样式。 | 需要丰富格式(加粗、颜色、超链接)。 |
1)纯文本多行显示:
def show_geometry(self):
self.ui.lab_text.setText('主窗口坐标信息,相对于屏幕\n'
+ '主窗口: x={}, y={}, width={}, height={}:\n'.format(self.x(),self.y(),self.width(),self.height())
+ '主窗口geometry: x={}, y={}, width={}, height={}:\n'.format(self.geometry().x(),self.geometry().y(),self.geometry().width(),self.geometry().height())
+ '主窗口frameGeometry: x={}, y={}, width={}, height={}:\n'.format(self.frameGeometry().x(),self.frameGeometry().y(),self.frameGeometry().width(),self.frameGeometry().height()))
self.ui.lab_text.setAlignment(Qt.AlignmentFlag.AlignLeft) #字符串居中显示
2)富文本多行显示:
# 富文本 (HTML)
#self.ui.lab_text2.setText("<a href='#'>这是一个html标签</a> <font color=red>hello <b>world</b> </font>")
self.ui.lab_text2.setText("""<b>加粗文本</b> ; <i>斜体文本</i> ; <span style='color: blue;'>蓝色文本</span><br>
<a href='https://www.qt.io'>这是一个超链接</a>""")
self.ui.lab_text2.setOpenExternalLinks(True)
3)设置QLabel背景色和字体颜色:
#设置QLabel背景色 和 字体颜色
self.ui.lab_text3.setText("这是一个有红色背景白色字体标签,左对齐。")
self.ui.lab_text3.setAutoFillBackground(True)
palette = QPalette()
palette.setColor(QPalette.ColorRole.Window, Qt.GlobalColor.blue)
palette.setColor(QPalette.ColorRole.WindowText, Qt.GlobalColor.green)
self.ui.lab_text3.setPalette(palette)
self.ui.lab_text3.setAlignment(Qt.AlignmentFlag.AlignCenter)
②图像显示
QLabel 是显示图片最常用的控件之一:
def file_filter(self):
file_name, _ = QFileDialog.getOpenFileName(self, caption='Open file1', dir=os.path.abspath('.'),
filter="Image files (*.jpg *.png *.bmp);;Image files2(*.ico *.gif);;All files(*)")
Pixmap = QPixmap(file_name)
self.ui.lab_image.setPixmap(Pixmap)
# 使用 setScaledContents 函数从而让图像自适应QLabel窗口
#self.ui.lab_Image.setScaledContents(True)
# 或者保持宽高比缩放
scaled_pixmap = Pixmap.scaled(self.ui.lab_image.geometry().width(), self.ui.lab_image.geometry().height(), Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)
self.ui.lab_image.setPixmap(scaled_pixmap)
# 对齐方式
self.ui.lab_image.setAlignment(Qt.AlignmentFlag.AlignCenter) # 图片在Label中居中显示
③动态内容与动画
QLabel 的内容可以动态更新,常用于显示实时信息:
def movie_gif(self):
# 创建 QMovie 对象并指定动画文件
self.movie = QMovie(':/res/Resources/image/007.gif')
# 将 QMovie 对象设置给 QLabel
self.ui.lab_gif.setMovie(self.movie)
# 启动动画
self.movie.start()
④使用快捷键
QLabel 快捷键本身没有太大的意义,但是可以通过伙伴关系(setBuddy)把指针快速切换到目标控件(如文本框)上,以便于使用快捷键操作:
# 伙伴功能 (Buddy)
self.ui.lab_N.setBuddy(self.ui.lineEdit)
self.ui.lab_P.setBuddy(self.ui.lineEdit_2)
⑤整体界面:
4.总结与选择指南
场景 | 推荐用法 |
---|---|
显示静态提示、标题 | setText() 纯文本 |
显示格式化的说明文字 | setText() 富文本 |
显示图标、Logo、照片 | setPixmap() |
为输入框提供标签和快捷键 | 使用 & 助记符和 setBuddy() |
显示超链接 | 富文本 + setOpenExternalLinks(True) |
一句话总结:
QLabel 远不止是一个简单的“标签”。它是一个强大的内容展示器,通过文本、图片、富格式和有限的交互,构成了应用程序用户界面的血肉,是每个 Qt 开发者必须熟练掌握的基础控件。
总结
以上就是关于PySide6基本窗口控件_主窗口(QMainWindow/QWidget/QDialog)和 标签(QLabel)的详细介绍,主要讲解了继承相关关系,核心的功能,以及使用场景。本节源代码路径为:Python-QWidgetQLabel基本窗口控件-主窗口(QMainWindow/QWidget/QDialog)和 标签(QLabel)的详细介绍
更多推荐
所有评论(0)