【pyqt】(八)ui文件使用

ui文件使用

前面我们已经学过了简单的UI文件创建(利用Qt Designer)和基础控件的使用。现在我们学习如何把二者融合起来完成开发。UI文件以 XML 格式存储界面的布局和各种控件的属性,我们可以利用Qt Designer开发界面,然后利用代码来实现后端的逻辑编程。这样可以将界面设计部分与逻辑编程部分分离,使得代码结构更加清晰。

在代码中调用ui文件有两种方法,一是动态调用,二是将其转为py文件之后调用。

动态调用

动态调用ui文件主要使用QUiLoader类完成,其需要在QApplication之前先实例化

这里使用我们之前使用Designer做的登录框例子,

py 复制代码
from PySide6.QtWidgets import QApplication,QWidget
from PySide6.QtUiTools import QUiLoader

uiLoader = QUiLoader()
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.ui = uiLoader.load("登录框.ui")  # 注意此处的路径,如果和当前python文件不在同一文件需要指定明确路径

if __name__ == '__main__':
    app = QApplication()
    window = MyWindow()
    window.ui.show()
    app.exec()

转换py文件

在命令行中使用这个命令将ui文件转为py文件

shell 复制代码
pyside6-uic ./ui/登录框.ui > login.py

py文件中的内容如下所示,它不像我们搭建的框架,把内容都写在init方法中,而是使用一个setupUi方法

py 复制代码
from PySide6.QtWidgets import QApplication,QWidget
from login import Ui_widget  # 导入生成的UI类

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_widget()  # 用一个属性来实例化
        self.ui.setupUi(self)  # 设置UI

if __name__ == '__main__':
    app = QApplication()
    window = MyWindow()
    window.show()
    app.exec()

实战-登录框

我们之前已经利用Designer实现过登录框的ui文件,现在让我们将其导入之后实现一下其登录的逻辑(简单实现,不连接数据库)。此处无论是使用动态加载还是静态加载的方法都是一样的。

py 复制代码
from PySide6.QtWidgets import QApplication,QWidget
from login import Ui_widget

class MyWeidget(QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_widget()
        self.ui.setupUi(self)
        # 这里的对象名要和Designer中的QObjectName对应
        self.ui.pushButton.clicked.connect(self.judgeUser)

    def judgeUser(self):
        account = self.ui.lineEdit.text()
        password = self.ui.lineEdit_2.text()
        if account=="123" and password=="123":
            print("登录成功")
        else:
            print("账号或密码错误")


if __name__ == '__main__':
    app = QApplication()
    window = MyWeidget()
    window.show()
    app.exec()

实战-计算器

我们实现一个简单的计算器界面如下,这里面的很多按键使用布局将它们排列整齐,然后给所有的控件都起一个合适的名字(QObjectName),这样方便我们在使用代码实现逻辑。

py 复制代码
from PySide6.QtWidgets import QApplication,QWidget
from PySide6.QtUiTools import QUiLoader


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.ui = uiLoader.load(r"ui/计算器.ui")
        self.bind()
        self.result = ''

    def bind(self):
        self.ui.pushButton_0.clicked.connect(lambda:self.addNumber('0'))
        self.ui.pushButton_1.clicked.connect(lambda:self.addNumber('1'))
        self.ui.pushButton_2.clicked.connect(lambda:self.addNumber('2'))
        self.ui.pushButton_3.clicked.connect(lambda:self.addNumber('3'))
        self.ui.pushButton_4.clicked.connect(lambda:self.addNumber('4'))
        self.ui.pushButton_5.clicked.connect(lambda:self.addNumber('5'))
        self.ui.pushButton_6.clicked.connect(lambda:self.addNumber('6'))
        self.ui.pushButton_7.clicked.connect(lambda:self.addNumber('7'))
        self.ui.pushButton_8.clicked.connect(lambda:self.addNumber('8'))
        self.ui.pushButton_9.clicked.connect(lambda:self.addNumber('9'))
        self.ui.pushButton_dot.clicked.connect(lambda:self.addNumber('.'))
        self.ui.pushButton_add.clicked.connect(lambda:self.addNumber('+'))
        self.ui.pushButton_min.clicked.connect(lambda:self.addNumber('-'))
        self.ui.pushButton_mul.clicked.connect(lambda:self.addNumber('*'))
        self.ui.pushButton_div.clicked.connect(lambda :self.addNumber('/'))
        self.ui.pushButton_equal.clicked.connect(self.equal)
        self.ui.pushButton_clear.clicked.connect(self.clear)
        self.ui.pushButton_back.clicked.connect(self.back)


    def addNumber(self,num):
        self.ui.textEdit.clear()
        self.result+=num
        self.ui.textEdit.setText(self.result)

    def equal(self):
        self.numresult = eval(self.result)
        self.ui.textEdit.setText(str(self.numresult))

    def clear(self):
        self.result = ''
        self.ui.textEdit.clear()

    def back(self):
        self.ui.textEdit.clear()
        self.result = self.result[:-1]
        self.ui.textEdit.setText(self.result)

if __name__ == '__main__':
    uiLoader = QUiLoader()
    app = QApplication()
    window = MyWindow()
    window.ui.show()
    app.exec()
相关推荐
曲幽5 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码5 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱14 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵16 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio20 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636721 小时前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817531 天前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱2 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2