Qt Designer 是 Qt 框架提供的可视化 UI 设计工具,允许开发者通过拖放组件的方式快速构建图形用户界面,而无需手动编写大量布局代码。它生成的界面文件(.ui)可被 PySide6(或 PyQt)直接加载,极大提升 Python GUI 开发效率。

在本文中,你将学会使用 QtDesigner 设计 UI,并在 Python 中使用它;

使用 Qt Designer 设计 UI

打开 Qt Designer

Qt Designer 不需要独立下载,在安装 PySide6 后,你可以在.\Python311\Scripts找到pyside6-designer.exe;其中Python311是 Python 的安装文件夹;

或者直接在终端运行命令pyside6-designer打开 Qt Designer;

设计窗体

打开 Qt Designer 后,创建一个Widget类型的窗体;

通过拖曳的方式,向窗体添加以下控件:

Qt Designer
向窗体添加控件
  • 2 个 Label
  • 2 个 Line Edit
  • 1 个 Push Button

在【视图】菜单中打开【属性检查器】,或使用快捷键Ctrl + I打开;

选择对应的控件,调整大小和位置,并完成以下属性的修改:

控件 属性
Label1 text 用户名:
Label2 text 密码:
Line Edit 1 objectName txtUser
maxLength 16
Line Edit 2 objectName txtPassword
maxLength 16
echoMode Password
Push Button objectName btnLogin
text 登录
窗体(Form) objectName frmLogin

预览效果

可以通过快捷键Ctrl + R预览效果,也可通过菜单【窗体】【预览于】选择预览风格;

Qt Designer
预览效果

添加信号与槽函数

从工具栏(下图中黄色高亮按钮)或快捷键F4切换到【编辑信号\槽】模式;如需返回【编辑窗口部件】模式,可通过下图中淡绿色按钮;

Qt Designer
工具栏

按住登录按钮,然后拖动鼠标,在窗体上的空白处松开(不要拖动到其他控件上);此行为将打开登录按钮的信号与槽函数连接窗口:

Qt Designer
配置信号与槽函数

选择clicked(),然后点击编辑(右边列表),添加一个名为login()的槽函数;选择login()并点击确定按钮;

Qt Designer
绑定信号与槽函数

保存文件

将设计好的 UI 保存为login.ui

在 Python 中使用 UI

有两种方式在 Python 中加载 Qt Designer 设计好的 UI:

  1. .ui文件转换成 Python 代码(推荐使用);
  2. 动态加载.ui文件;

将 UI 文件转换成 Python 代码

在终端使用以下命令将保存的.ui文件转换为.py文件:

pyside6-uic.exe与 Qt Designer 在同一文件夹;

UI 被修改后需要重新生成新的 Python 代码;

pyside6-uic.exe login.ui -o ui_login.py

命令执行完后将生成一个ui_login.py文件,代码中创建了一个Ui_frmLogin的类以及setupUi方法,用于初始化控件;

示例代码如下:

import sys
from PySide6 import QtCore, QtWidgets, QtGui

import ui_login #导入ui_login.py

class LoginWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        
        self.ui = ui_login.Ui_frmLogin()#实例化UI对象
        self.ui.setupUi(self)#初始化

    @QtCore.Slot()#槽函数用它装饰
    def login(self): #在Qt Designer中为登录按钮命名的槽函数;
        print(self.ui.txtUser.text(),self.ui.txtPassword.text())

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    widget = LoginWidget()
    widget.show()
    sys.exit(app.exec())

动态加载 .ui 文件

使用此方法不要在 Qt Designer 中设置信号与槽,会导致无效!

示例代码如下:

import sys
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QFile

class LoginWidget(QWidget):
    def __init__(self):
        super().__init__()
        
        loader = QUiLoader()  # 创建 QUiLoader 对象用于加载 .ui 文件
        ui_file = QFile("login.ui") # 指定要加载的 UI 文件
        ui_file.open(QFile.ReadOnly) # 以只读模式打开 UI 文件
        # 加载 UI 文件,返回一个 QWidget 实例
        self.ui = loader.load(ui_file, self)
        ui_file.close() # 关闭 UI 文件

        #动态加载需要自行处理信号与槽
        #将 btnLogin 的点击行为连接到 login 方法
        self.ui.btnLogin.clicked.connect(self.login)

    def login(self):
        print(self.ui.txtUser.text(),self.ui.txtPassword.text())

if __name__ == "__main__":
    app = QApplication([])
    widget = LoginWidget()
    widget.show()
    sys.exit(app.exec())