PyQt5实现多文件调用以及UI和逻辑分离

这篇具有很好参考价值的文章主要介绍了PyQt5实现多文件调用以及UI和逻辑分离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UI   ui_untitled.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(475, 331)
        MainWindow.setProperty("menu", "")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
      
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)

        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
       
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_2.addWidget(self.pushButton_2)

        self.retranslateUi(MainWindow)

        #实现装饰器信号与槽,self.pushButton.setObjectName("pushButton")和下面是必须得
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

逻辑代码页

#  ui下的ui_untitled.py....类 Ui_MainWindow
from ui.ui_untitled import *


class winForm(Ui_MainWindow, QMainWindow):
    def __init__(self):
        super(winForm, self).__init__()  # 运行父类的构造方法
        self.setupUi(self)  # 传递自己

    @QtCore.pyqtSlot()
    def on_pushButton_clicked(self):
        QMessageBox.information(self, "提示", "btn1信息对话框", QMessageBox.Ok | QMessageBox.Cancel)
    @QtCore.pyqtSlot()
    def on_pushButton_2_clicked(self):
        """

        :param self:
        """
        QMessageBox.information(self, "提示", "btn2信息对话框", QMessageBox.Ok | QMessageBox.Cancel)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = winForm()  # 创建PyQt设计的窗体对象
    ui.show()  # 显示窗体
    sys.exit(app.exec_())

目录

一、PyCharm+PyQt5的环境配置

二、使用Qt Designer将界面显示与业务逻辑分离

三、PyQt5工程中的多文件开发


转自原文链接

作为一个使用C++开发QT五年的“老”程序猿,总觉得使用C++开发GUI,是一个很费时费力或者说没有“钱”途的事情,因为现在有大量的轻量化的编程语言可以做很绚丽的交互界面,所以笔者现在逐渐向Python转移,逐渐使用PyQt5开发Qt项目,作为一个python新手,请大家多多指教。

一、PyCharm+PyQt5的环境配置

具体配置可以在网上搜其它帖子,在这里不作过多论述。

个人在使用过程中,有个习惯,当我们新建了xxx.ui文件,然后使用pyuic5生成xxx.py文件的时候,为了更清楚的看出来这个py文件是由ui文件生成的,也为了防止我们修改这个文件,可以在setting中将pyuic5的Arguments配置中改为“$FileName$ -o ui_$FileNameWithoutExtension$.py”,这样生成的py文件都是加了“ui_”前缀的。

qt其他文件调用ui,python,开发语言

二、使用Qt Designer将界面显示与业务逻辑分离

大部分的教程都是将使用Qt Designer进行界面布局和Qt中控件的使用分开来讲,讲Qt Designer的时候直接在.ui文件生成的.py文件里面进行修改,这样虽然可以理解界面和代码之间是如何互联共通的,但是不方便.ui文件的修改。在讲Qt的各种控件的使用的时候,又几乎全部用代码在布局界面,这对于初识Qt的新手来说倒还可以,但对于像笔者这种只换语言不换框架的工程师来讲,未免有点太拖沓,所以我们直接讲将界面显示与业务逻辑分离的方式开发。

1、例如我新建一个mainpage.ui文件,里面放几个控件。

qt其他文件调用ui,python,开发语言

2、将mainpage.ui文件转换成ui_mainpage.py文件

qt其他文件调用ui,python,开发语言

当然,也可以直接使用命令生成,不过需要配置环境变量,需要大家自己去配置,“pyuic5 -o ui_mainpage.py mainpage.ui”

生成的mainpage.py文件,其完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mainpage.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainPage(object):
 def setupUi(self, MainPage):
        MainPage.setObjectName("MainPage")
        MainPage.resize(739, 449)
 self.layoutWidget = QtWidgets.QWidget(MainPage)
 self.layoutWidget.setGeometry(QtCore.QRect(90, 80, 521, 271))
 self.layoutWidget.setObjectName("layoutWidget")
 self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
 self.gridLayout.setContentsMargins(8, 8, 8, 8)
 self.gridLayout.setObjectName("gridLayout")
 self.driveButton = QtWidgets.QPushButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(14)
 self.driveButton.setFont(font)
 self.driveButton.setObjectName("driveButton")
 self.gridLayout.addWidget(self.driveButton, 2, 0, 1, 1)
 self.rangingButton = QtWidgets.QPushButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(14)
 self.rangingButton.setFont(font)
 self.rangingButton.setObjectName("rangingButton")
 self.gridLayout.addWidget(self.rangingButton, 1, 0, 1, 1)
 self.cameraButton = QtWidgets.QPushButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(14)
 self.cameraButton.setFont(font)
 self.cameraButton.setObjectName("cameraButton")
 self.gridLayout.addWidget(self.cameraButton, 0, 0, 1, 1)

 self.retranslateUi(MainPage)
        QtCore.QMetaObject.connectSlotsByName(MainPage)

 def retranslateUi(self, MainPage):
        _translate = QtCore.QCoreApplication.translate
        MainPage.setWindowTitle(_translate("MainPage", "小车控制器"))
 self.driveButton.setText(_translate("MainPage", "打开电机驱动控制界面"))
 self.rangingButton.setText(_translate("MainPage", "打开超声波测距控制界面"))
 self.cameraButton.setText(_translate("MainPage", "打开摄像头控制界面"))

3、新建一个业务逻辑文件,我们可以起名叫“call_mainpage.py”,我们可以在这个文件中新建一个MainPageWindow类,让它继承由ui文件生成的py文件中的Ui_MainPage类,这样我们所有的业务逻辑处理,都可以在“call_mainpage.py”文件中进行,这样就不管UI文件什么事情了,当修改ui文件后,只影响生成的py文件,逻辑处理文件不受影响。

编写的call_mainpage.py文件,其代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from HomePages.ui_mainpage import Ui_MainPage
from PyQt5.QtCore import pyqtSignal,Qt

class MainPageWindow(QWidget,Ui_MainPage):
 #定义点击信号
 chooseSignal = pyqtSignal(str)
 def __init__(self,parent=None):
 super(MainPageWindow, self).__init__(parent)
 self.setupUi(self)
 self.initUI()

 def initUI(self):
 self.setLayout(self.gridLayout)
 self.cameraButton.clicked.connect(self.showDialog)
 self.rangingButton.clicked.connect(self.showDialog)
 self.driveButton.clicked.connect(self.showDialog)

 def showDialog(self):
        sender = self.sender()
 if sender == self.cameraButton:
 #发射点击信号
 self.chooseSignal.emit('camera')
 elif sender == self.rangingButton:
 self.chooseSignal.emit('ranging')
 elif sender == self.driveButton:
 self.chooseSignal.emit('drive')

4、在MainPageWindow类中,我定义一个chooseSignal信号,用于向外界发送按钮点击信号。

这样大家可以直接在call_mainpage.py文件中添加程序main入口运行了:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainPageWindow()
    mainWindow.show()
    sys.exit(app.exec_())

不过我暂时没有在这个文件中添加main入口,因为我要在其它文件中创建main入口,进行多文件调用。

三、PyQt5工程中的多文件开发

习惯使用C++开发Qt工程,都是习惯多文件分离开发,每个界面一个ui文件,转换后加一个py文件,再加负责一个业务逻辑的py文件,一共三个文件。例如写一个四个界面的工程,步骤如下:

1、使用Qt Designer新建四个不同的ui文件,分别为camerapage.ui、drivepage.ui、mainpage.ui、rangingpage.ui

qt其他文件调用ui,python,开发语言

2、使用pyuic5将四个ui文件转换成对应的py文件,分别为ui_camerapage.py、ui_drivepage.py、ui_mainpage.py、ui_rangingpage.py

qt其他文件调用ui,python,开发语言

可以将和UI文件相关的文件放在一个目录中,方便管理,笔者把它们都放在了HomePages目录中。

qt其他文件调用ui,python,开发语言

3、创建四个“ui_”文件对应的业务逻辑文件,分别为call_camerapage.py、call_drivepage.py、call_mainpage.py、call_rangingpage.py

call_camerapage.py文件内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal,Qt
from HomePages.ui_camerapage import Ui_CameraPage

class CameraPageWindow(QWidget,Ui_CameraPage):
 #声明信号
 returnSignal = pyqtSignal()

 def __init__(self,parent=None):
 super(CameraPageWindow, self).__init__(parent)
 self.setupUi(self)
 self.initUI()

 def initUI(self):
 self.setLayout(self.gridLayout)

 self.returnButton.clicked.connect(self.returnSignal)

call_drivepage.py文件内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal,Qt
from HomePages.ui_drivepage import Ui_DrivePage

class DrivePageWindow(QWidget,Ui_DrivePage):
 # 声明信号
 returnSignal = pyqtSignal()

 def __init__(self, parent=None):
 super(DrivePageWindow, self).__init__(parent)
 self.setupUi(self)
 self.initUI()

 def initUI(self):
 self.setLayout(self.gridLayout)

 self.returnButton.clicked.connect(self.returnSignal)

call_rangingpage.py文件内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal,Qt
from HomePages.ui_rangingpage import Ui_RangingPage


class RangingPageWindow(QWidget,Ui_RangingPage):
 # 声明信号
 returnSignal = pyqtSignal()

 def __init__(self, parent=None):
 super(RangingPageWindow, self).__init__(parent)
 self.setupUi(self)
 self.initUI()

 def initUI(self):
 self.setLayout(self.gridLayout)

 self.returnButton.clicked.connect(self.returnSignal)

call_mainpage.py在前面讲过了,就不重复了,其实每个call_文件的框架都一样,分别声明了CameraPageWindow、DrivePageWindow、RangingPageWindow、MainPageWindow四个类,每个类分别继承自己对应的UI类。

4、这时候需要一个总界面,用来整合所有子页面,并负责界面之间的切换等功能,新建一个mainwindow.py文件,内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *

from call_mainpage import MainPageWindow
from call_camerapage import CameraPageWindow
from call_drivepage import DrivePageWindow
from call_rangingpage import RangingPageWindow

class MainWindow(QWidget):
 def __init__(self):
 super().__init__()
 self.initUI()

 def initUI(self):
 self.resize(480,320)
 self.layout = QGridLayout()
 self.setLayout(self.layout)

 self.Stack = QStackedWidget()
 self.layout.addWidget(self.Stack)
 self.mainPageUi = MainPageWindow()
 self.cameraPageUi = CameraPageWindow()
 self.drivePageUi = DrivePageWindow()
 self.rangingPageUi = RangingPageWindow()

 self.Stack.addWidget(self.mainPageUi)
 self.Stack.addWidget(self.cameraPageUi)
 self.Stack.addWidget(self.drivePageUi)
 self.Stack.addWidget(self.rangingPageUi)

 self.mainPageUi.chooseSignal.connect(self.showDialog)

 self.cameraPageUi.returnSignal.connect(self.returnDialog)
 self.drivePageUi.returnSignal.connect(self.returnDialog)
 self.rangingPageUi.returnSignal.connect(self.returnDialog)

 def showDialog(self,msg):
 print(0)
 if msg == 'camera':
 self.Stack.setCurrentIndex(1)
 print(1)
 elif msg == 'ranging':
 self.Stack.setCurrentIndex(2)
 print(2)
 elif msg == 'drive':
 self.Stack.setCurrentIndex(3)
 print(3)

 def returnDialog(self):
 self.Stack.setCurrentIndex(0)

我在这里使用了QStackedWidget叠层窗口,将所有子窗口添加进来,根据不同的点击显示不同的页面。

5、最后,需要有一个main入口,我们单独再写一个main.py文件,这也和C++工程比较统一,具体内容如下:

from PyQt5.QtWidgets import *
from mainwindow import MainWindow
import sys

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

6、PyQt5的多界面开发工程的大体框架就完成,现在只需要添加具体的内容即可,可以运行试一下,注意一定要运行main.py文件,如果运行其它py文件,只会出现如下提示。文章来源地址https://www.toymoban.com/news/detail-656215.html

到了这里,关于PyQt5实现多文件调用以及UI和逻辑分离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyQt6 使用Qt Designer实现简单的界面,以及ui文件转py文件

    前言,主要通过参考并总结两篇文章中的部分内容,参考文章一 参考文章二 新增一个用户注册界面,包含用户名,密码,性别,手机号,点击注册按钮时,弹出一个对话框,提示恭喜 “{用户输入的用户名}” 注册成功。但是无奈还没找出获取最新输入用户名的值,就简单做

    2024年02月04日
    浏览(38)
  • PYQT5 ui转py后的调用

    将程序按文件夹分好类,检查时更加清晰如先建立resource文件夹,内部含images(存放图片)、UI(存放UI文件),resource文件夹与main等设计界面程序并列,ui转成py时放在resource文件夹下边。  login_pane.py(将转换好的login.py引用,在此处对界面进行设计) 将做好的界面类引到主界面

    2024年02月06日
    浏览(66)
  • <Python>PyQt5中UI界面和逻辑函数分开写的一种方式

    前言 如果经常使用PyQt5这种模块来编写带UI界面的程序,那么很自然的就会涉及到,一旦程序比较大,UI控件多的时候,需要将UI和逻辑程序分离,这样方便管理,也方便维护。 配置: 平台:windows 工具:visual studio code 语言:python 库:PyQt5 本文将提供一个简单但可用的实例,

    2024年02月02日
    浏览(41)
  • 【YOLOV5 入门】——Pyside6/PyQt5可视化UI界面&后端逻辑

    声明:笔记是做项目时根据B站博主视频学习时自己编写,请勿随意转载! VScode/Pycharm 终端进入虚拟环境后,输入下面代码安装 pyside6 ,若用的 Pycharm 作为集成开发环境,也下载个 pyqt5 : 安装完 pyside6 时其实一并安装了 qtdesigner ,这个工具可让我们以拖拽的方式设计界面,按

    2024年04月16日
    浏览(70)
  • Python - PyQT5 - ui文件转为py文件

    在QTdesigner图形化编辑工具中,有些控件我们是可以直接在编辑界面进行编辑的,有些是不可以编辑的,只能通过Python代码进行编辑,不过总体来说,所有能够通过图形化编辑界面可以编辑的,都可以通过Python语言实现控制,这点是毋庸置疑的,不过为了更加美观及降级软件开

    2024年02月05日
    浏览(39)
  • Pyqt5将.ui文件转换成.py文件的两种方式

    PyQt 5安装成功后,pyuic5命令默认安装在%/python3x/Scripts目录下。我的pyuic5的安装路径是E:python35.Scripts。 如果想将firstMainWin.ui转换成.py文件,输入以下命令即可: 注意:如果输入pyuic5命令没有得到正确提示,而是提示“pyuic5不是内部命令或外部命令,也不是可运行的程序或批处理

    2024年02月11日
    浏览(51)
  • PyQt5将.ui文件转换为.py文件的两种方法

    PyQt5是一个流行的Python库,用于创建图形用户界面(GUI)应用程序。在PyQt5中,可以使用Qt Designer工具创建GUI界面,并将其保存为.ui文件。然后,可以使用两种方法将.ui文件转换为.py文件,以便在Python代码中使用。 方法一:使用PyUIC工具 PyQt5附带了一个命令行工具 called pyuic5,

    2024年02月06日
    浏览(41)
  • Pyqt5实现新线程更新窗口UI

    我们用pyqt5开发窗口应用时,应用会执行一些耗时的操作,如复制大量文件,下载大量数据等。一般情况下,在这些操作没有完成时,窗口的UI处于“假死”状态,不会更新,只有所有操作完成后,窗口的状态才会更新。这样对用户使用非常不友好。 使用多线程技术,在新线

    2024年02月13日
    浏览(32)
  • PyQt5利用Qt Designer制作一个可以拖动获取文件信息的页面

    前言 本篇在讲什么 用pyqt5制作一个简单的程序,拖动文件或脚本可以读取文件信息 本篇适合什么 适合 初学PyQt5 的小白 本篇需要什么 对 Python 语法有简单认知 对 Qt 有简单认知 依赖 Pycharm 编辑器 本篇的特色 具有全流程的 图文教学 重实践,轻理论,快速上手 提供全流程的

    2024年01月15日
    浏览(54)
  • 如何在pycharm里边配置pyqt5、qt5-applications,使用拖拽功能设计UI界面

    安装pyqt5和qt5-applications 网上很多说要安装pyqt5-tools,但是里边并没有找到designer.exe这个文件,最终是在qt5-applications里边的Qt/bin找到了designer.exe文件。 在pycharm中配置designer working directory可以自己手动配置工程目录,也可以直接点击后面的按钮选择$ProjectFileDir$ 在pycharm中配置p

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包