PyQt5界面与逻辑的分离

一、问题描述

当我们用QtDesigner制作完一个.ui界面后,转化成.py文件。之后又对此界面不太满意,想要重新修改完善界面,如果重新修改界面,对应的.py文件也会发生变化,除了自动生成的界面代码,我们还写入了其他逻辑功能程序代码,所以我们除了重新将完善后的.ui文件转化为.py文件外,也还要将自己的逻辑功能代码写进程序。所以工作量会很大。

二、问题思路

那有没有一种方法将界面文件与自己编写的逻辑程序代码分开呢,这样当我们修改界面后,只需生成对应的.py文件(界面文件)即可,自己编写的逻辑程序代码也不用跟着重新写进程序了,因为此时界面文件与自己的逻辑功能代码(逻辑文件)是相互独立的,不会受到界面文件变化的影响。即这就是所谓的界面与逻辑的分离。所以需要新建一个.py文件(逻辑文件)来调用界面文件,这个新建的.py文件也就是逻辑文件。

PyQt5界面与逻辑的分离

三、问题解决

  1. 首先以界面两次跳转为例。之前的代码都在一个文件里,即生成的界面代码与自己编写的逻辑功能代码都在同一个界面里。第一个界面文件(experiment_5.py)代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
import experiment_6
from experiment_6 import *

class Ui_MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent = None):
        super(Ui_MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.retranslateUi(self)
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(330, 160, 131, 51))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
在PyQt6中,可以通过使用QThread类来创建线程,同时使用界面逻辑分离的方法可以使代码更加清晰易懂。 下面是一个简单的示例: ```python from PyQt6.QtCore import QThread, pyqtSignal from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget class Worker(QThread): finished = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) def run(self): # 在这里执行耗时操作 self.finished.emit() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.button = QPushButton("开始") self.button.clicked.connect(self.start_work) self.setCentralWidget(QWidget(self)) self.centralWidget().setLayout(QVBoxLayout()) self.centralWidget().layout().addWidget(self.button) def start_work(self): self.button.setEnabled(False) self.worker = Worker() self.worker.finished.connect(self.finish_work) self.worker.start() def finish_work(self): self.button.setEnabled(True) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec() ``` 在此示例中,我们创建了一个Worker类作为我们的线程类,并重写了run方法以执行耗时操作。我们还定义了一个finished信号,当线程完成时会发出此信号。 在MainWindow类中,我们创建了一个QPushButton对象,当被点击时,我们创建一个Worker对象并启动它。我们还连接了Worker的finished信号到finish_work方法中,以在线程完成时更新主窗口。 通过这种方式,我们将逻辑界面分离,从而使代码更加易于维护和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值