前言

前面四节已详细介绍了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)的详细介绍

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐