【快速调用】基于mvc架构的pyqt架构封装

本文介绍了使用PyQt5搭建框架的快速创建流程,包括新建项目、构建目录、配置pyuic等步骤。同时提到了串口通信时的数据进制转换问题,以及UI页面制作和多线程执行的注意事项,如学完GUI基础再设计、尽量避免开多线程等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

使用pyqt5进行开发已经有一段时间了,再加上自己曾有过web开发的经历,将web端完善的架构搬进了pyqt5里进行使用,使开发效率得到了极大的提升,下面我从一个新的项目开始搭建pyqt5的框架。

快速创建流程及规范

按照该创建流程创建的项目,具有一定的规范性,在开发上具有较好的程序鲁棒性,本项目的框架基于web开发的框架进行搭建。

该部分默认您已经配置好pyqt5开发所需要的流程,即已经配置好了QtDesigner在这里插入图片描述
那么接下来我们开始操作。

1.新建一个项目

新建项目,使用系统编译器(即您已经配置好pyqt5的编译器)

2.构建项目目录

我常用的项目目录如下

  • main.py 主程序入口
  • views 存放ui页面文件
  • controller 用于继承views进行控制
  • util 工具类
  • static 静态资源,如图片
  • serive 服务构建
  • pojo 简单实体类

这也是web开发比较常见的架构,根据需要来添加目录,但是main.py/view/controller是一定要有的目录

3.打开QtDesigner新建一个页面

新建一个页面文件保存在views目录下,取名为Home.py
在这里插入图片描述
在这里插入图片描述

4.配置pyuic

pyuic是将ui文件转为py的文件的工具,只有转为py文件才能进行操作

Programs:pyuic5.exe所在的位置
Arguments:$FileName$ -o $FileNameWithoutExtension$.py -x
Working directory:$ContentRoot$\views

在这里插入图片描述

Working directory配置的前提是你的目录内也有views且views也是放ui文件的地方

5.转换ui文件

在这里插入图片描述
在这里插入图片描述

6.controller配置

controller用于页面的控制和页面内容的开发,将会继承py页面文件的内容进行开发,而不是在py页面文件上直接进行开发,因为直接使用py页面文件进行开发,每次ui文件修改后py页面文件都将被覆盖。

在Controller下创建一个py文件名为HomeCtroller.py
在这里插入图片描述
HomeController.py的内容直接copy以下代码

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QApplication, QMessageBox, QLineEdit,QMainWindow
from views.home import Ui_MainWindow


class HomeController(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        # 往空的QWidget里面放置UI内容
        self.setupUi(self)
        self.initAttr()
        self.initFun()

    # 属性处理
    def initAttr(self):
        self.setWindowTitle("Title")

    # 信号与槽绑定
    def initFun(self):
        pass

    # 信号的实现
    def something(self):
        print("the button is here")

配置main.py

复制以下代码

from PyQt5 import QtWidgets
from controller.HomeController import HomeController

# 主程序入口
if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    Form = HomeController()
    Form.show()
    sys.exit(app.exec_())

以后在运行的时候就直接运行main.py就可以启动页面了

在这里插入图片描述

注意事项

关于串口通信

  • 串口通过标志信号为转换为一个一个字节
  • 每个字节转换为ASCII码
  • ASCII码转换为16进制
  • 接受16进制
  • 16进制转换为10进制就是对应所需要的数据

在接受串口数据的时候,可能会涉及进制转换的问题,这里附上我的结局方案。

"""
该测试用于测试连接起与振动传感器之间的通讯关系,并且接受到振动数据
    是一个基础的测试模块
"""

import serial
import sys
import time


# 十六进制显示
#将输入的二进制数据流转换为16进制
def hexShow(argv):
    try:
        result = ''
        hLen = len(argv)
        for i in range(hLen):
            hvol = argv[i]

            #不足两位,则补0,以16进制表示bytes数据流
            hhex = '%02x' % hvol
            result += hhex + ' '
        return result
    except Exception as e:
        print("---异常---:", e)


if __name__ == '__main__':

    #创建端口对象
    ser =serial.Serial()
    try:
        #传入参数
        ser = serial.Serial("COM1", 115200, timeout=0.01)

        #连续发送信息
        while 1:
            #传入一个16进制数组
            ser.write(bytes([0x01, 0x04, 0x01, 0xA1, 0x00, 0x17, 0xE0, 0x1A]))

            #设置发送间隔时间为0.3s
            time.sleep(0.3)

            #打印输出的16进制信息
            print(hexShow(ser.read_all()))
    except Exception as e:
        print('端口连接失败,错误原因:\n',e)
#关闭串口
sys.exit()

这段代码中我传入了一组数据,最后连接串口,接口到的数据如下。
在这里插入图片描述
然后就可以对照这通信协议来翻译这段数据的意思了

关于UI页面的制作

推荐大家最好不要半路出山,先把整个GUI的基础学完再去设计GUI,不然上手难度会很大,一直研究也会很累。

关于多线程的执行

在通过串口连续发送数据的时候,ui界面会无法操作,这是行为单线程处理的结果,串口通信没有结束的话,就一直无法操作,而如果你要是想一直获取数据 ,那么就会在界面中卡住,所以我们可以做的就是在运行定式发送信息的时候开多线程,并行运行以保证UI的流畅性与功能完整使用。

当然,多线程也有一种解决方法,即PyQt5提供了自带的QTimer工具,通过QTimer工具可以实现一些功能的周期性实现而不会影响用户体验,关于QTimer详细的使用大家可以SCDN一下。

友情提醒:能不开多线程尽量不要开多线程,因为分配一个新的线程需要比较大的资源开销,很多情况下有很多其他更好的解决方法来代替。

### PyQt5 MVC框架架构PyQt5中,MVC(Model-View-Controller)模式被广泛应用于构建用户界面应用程序。这种设计模式有助于分离数据处理逻辑、业务逻辑以及展示层。 #### 架构概述 MVC模式通过三个主要组件来实现: - **模型 (Model)**:负责管理应用的数据和核心功能[^1]。 - **视图 (View)**:用于显示数据并提供用户交互接口。 - **控制器 (Controller)** 或者代理(Delegate),在某些情况下也被称为Item Delegate,在PyQt5中通常指的是`QStyledItemDelegate`或其子类,它定义了如何绘制项以及编辑项的行为。 对于具体的架构图,虽然无法直接在此处呈现图像文件,但是可以描述如下结构: 1. 应用程序启动时创建一个主窗口实例; 2. 主窗口内包含多个视图表单部件(widgets),这些部件连接到相应的信号槽机制上; 3. 数据源由模型对象表示,它可以是一个简单的列表或者更复杂的数据存储形式; 4. 当数据显示发生变化时,通知给所有已注册的观察者即视图部分更新UI; 下面给出一段简化版的例子以说明上述概念的应用方式: ```python from PyQt5.QtWidgets import QApplication, QTableView import sys from PyQt5.QtCore import Qt, QStringListModel def main(): app = QApplication(sys.argv) # 创建字符串列表作为简单模型 model = QStringListModel() string_list = ["item 1", "item 2", "item 3"] model.setStringList(string_list) # 初始化表格视图并将模型设置进去 view = QTableView() view.setModel(model) # 显示窗口 view.show() sys.exit(app.exec_()) if __name__ == '__main__': main() ``` 此代码片段展示了如何利用`QStringListModel`作为基本模型,并将其绑定至`QTableView`控件之上形成完整的MVC链路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeeland

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值