Python学习笔记——PySide6设计GUI应用之UI与逻辑分离

1、打开PySide6的UI设计工具pyside6-designer,设计一个主窗口,保存文件名为testwindow.ui

2、使用PySide6的RCC工具把testwindow.ui文件转换为testwindow_rc.py文件,此文件中有一个类Ui_MainWindow(包含各种控件对象)

一、通过类继承实现:

# 导入标准库sys
import sys
# 导入PySide6库中的两个类:QApplication, QMainWindow
from PySide6.QtWidgets import QApplication, QMainWindow
# 导入使用PySide6-Rcc工具转换的UI设计窗口Ui_MainWindow类
from testwindow_rc import Ui_MainWindow

# 应用程序
class TestMainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(TestMainWindow, self).__init__()
        self.setupUi(self)

if  __name__ == '__main__':
    app = QApplication(sys.argv)
    win = TestMainWindow()
    win.show()
    sys.exit(app.exec())

class TestMainWindow(QMainWindow, Ui_MainWindow): 定义了一个新的类TestMainWindow,它继承自 QMainWindow(PySide6.QtWidget中的QtMainWindow类) 和 Ui_MainWindow。

在这种多重继承的情况下,QMainWindow 是 PySide6中提供的一个主窗口类,它包含了很多创建和管理主窗口的功能。而 Ui_MainWindow 是由 PySide6 Designer 生成的一个界面类,它包含了在设计器中设计的窗口界面及其上的所有元素和布局。

TestMainWindow 类通过继承这两个类,同时获得 QMainWindow 的窗口管理功能和 Ui_MainWindow 的界面元素。

调用执行self.setupUi(self) :其实是调用Ui_MainWindow中的setupUi()方法,传入实参self是TestMainWindow类的实例对象,从而实现设计的窗口界面及其上元素(控件)的初始化完成布局。

通过上面的分离,以后修改Ui文件进行界面元素添加和修改属性等,然后转化Ui文件,将不影响逻辑代码。

另外,定义和设计方法来控制窗口及其上控件的行为,响应用户的操作等。要在TestMainWindow类的 __init__(self) 及其它方法中完成,这样不会因为修改ui文件及转化而被覆盖。

super(TestMainWindow, self).__init__(),是 Python 中用于调用父类构造方法的一种写法。在这里,TestMainWindow 是子类,而 self 是子类的实例。super() 函数是用来临时改变当前类的父类,并返回一个父类的实例。因此,super(TestMainWindow, self) 返回的就是 TestMainWindow 的父类的一个实例,然后调用其 __init__() 方法,即初始化方法。

这样做的目的是在子类的 __init__() 方法中,首先执行父类的 __init__() 方法,以便能够继承父类的属性和方法。这是一种常见的在面向对象编程中实现继承的方式。

在 Python 3 中,可以直接在子类中使用 super().__init__(),Python 会自动解析当前类和 self,不需要显式地传入。

二、关联界面类来实现

# 导入标准库sys
import sys
# 导入PySide6库中的两个类:QApplication, QMainWindow
from PySide6.QtWidgets import QApplication, QMainWindow
# 导入使用PySide6-Rcc工具转换的UI设计窗口Ui_MainWindow类
from testwindow_rc import Ui_MainWindow

# 创建的类继承PySide6的主窗口类QMainWindow
class TestMainWindow(QMainWindow):

    def __init__(self):
        # 执行父类QMainWindow的构造函数,从而让子类TestMainWindow的实例对象
        # 具有父类的功能和属性
        super().__init__()

        # 创建Ui界面类实例,并赋值给TestMainWindow的实例对象属性ui
        self.ui = Ui_MainWindow()
        
        # 调用TestMainWindow的实例对象属性ui的setupUi()方法
        # 传入实参self是TestMainWindow的实例对象,从而实现Ui界面元素的创建
        self.ui.setupUi(self)

if  __name__ == '__main__':
    app = QApplication(sys.argv)
    win = TestMainWindow()
    win.show()
    sys.exit(app.exec())

三、直接载入Ui文件

import sys
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader
# 导入PySide6库中的两个类:QApplication
from PySide6.QtWidgets import QApplication
class TestMainWindow:
    def __init__(self):
        super(TestMainWindow, self).__init__()
        # 从ui文件中加载UI定义
        qfile = QFile("testwindow.ui")
        qfile.open(QFile.ReadOnly)
        qfile.close()
        # 从UI定义中动态创建一个相应的窗口对象
        self.ui = QUiLoader().load(qfile)

        if not self.ui:
            print(QUiLoader().errorString())
            sys.exit(-1)

if  __name__ == '__main__':
    app = QApplication(sys.argv)
    win = TestMainWindow()
    win.ui.show()
    sys.exit(app.exec())

笔者建议使用第一种方法,通过继承方式。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值