前言

初次接触较大型的软件开发项目,找了几天可参照的项目无果,于是自己模仿django中的结构来做一个MVC开发模式规划,也有点闭门造车的意思,如有其他好的办法分享,下方评论见。

(本篇文章从零开始,以开发一个小应用的视角分享我的MVC规划)
(ps: 10.31的更新,目前发现了一个MVD的模式详见https://www.cnblogs.com/chusiyong/p/12941212.html)

  • 前言
  • 1 快速开始
    • 一般PyQt5会怎么使用?
    • django的结构中给了什么?
    • 一个小说爬虫阅读器的开发(可跳过)
  • 2 最终结构

1 快速开始

在这里将django文件结构一步步拆解,并考虑PyQt5的特点,进行复刻。

一般PyQt5会怎么使用?

①手写的
比较容易找到的一些PyQt5的文档,基本上都是手写,主要是因为要突出文章要介绍的功能,以及给读者复制即可使用的demo,方便理解。所以ui和功能部分都写在了同一个文件中,没有形成文件结构。当然了,估计也没人在开发时这么写。

class Test(QWidget):def __init__(self):super().__init__()self.btn1 = QPushButton('按钮1', self)self.btn1.move(100, 100)self.btn1.clicked.connect(self.printer)def printer(self):print(1)

②生成的
主要来源于 PyQt5 Designer,这是一个绘画生成代码的工具,十分好用。一些结构性的东西通过绘画来生成,而进阶性操作就通过引用ui来添加。还是一样的代码,但清晰了不少,也具有了更高的可扩展性。按照这个思路写下去慢慢会遇到,静态文件的添加,样式的修改,类的抽象,小工具,数据库的引用等等…所以需要有一个完整的规划。

from test_ui import Ui_testclass Test(QWidget, Ui_test):def __init__(self):super().__init__()self.setupUi(self)self.btn1.clicked.connect(self.printer)def printer(self):print(1)

django的结构中给了什么?

这是一个开发完成了的django项目,静态文件,样式,模板等规划明确,所有的大的页面作为一个app,app里还有各类细微的规划,也有一些是富有django特性的东西,如urls,admin,apps这之类的不需要关注的东西。现在的目的很清晰,将一些特性化的东西舍去,拆解整个结构,转换成具有PyQt5特色的MVC开发结构。

一个小说爬虫阅读器的开发(可跳过)

已上传至github,建议结合文件目录食用 https://github.com/yejue/myReader

①功能分析
爬行状态页:输入网址->爬行开始->入库
小说阅读页:读数据库->显示
几个示例url:
https://read.qidian.com/chapter/HnWqMLj7BKecikCo3ZPkrg2/f-apiAeDULf6ItTi_ILQ7A2
https://read.qidian.com/chapter/AEFk0gzAWnGoUTngny7bXQ2/7Z2gygXUR7lOBDFlr9quQA2

②根据需求拆解django结构重组

先抛出几个概念:

  • ui:使用PyQt5 Designer绘画生成的py文件,偏向于搭建一个结构
  • controller:对Designer无法完成的操作,使用 controller 来做延伸操作,通常与 ui 挂钩。二者的关系类似于 html 与 js,controller 自行创建。
  • view:仿写的view只是一个用于返回和接收数据的功能视图。
  • loader:与django不同,PyQt5的数据需要自行搬运,定制一个介于view和controller之间的数据搬运器,用于数据之间的传输和调用controller。

如此,一个MVC结构出现了:

  • models + view —— 返回或接收数据库数据,对应 M
    controller + ui —— 呈现初始页面以及修改页面,对应 V
    loader —— 介于数据与“前端”之间,对应 C

  • main_controller —— 在一个主要的控制器中实例页面,使得所有的页面在同一个作用域,这是页面间数据传递的基础(Qt 实在太广大了,此举仅限于本人目前的认知)。

拆解重组后总体结构如下:

  • utils:存放一下小工具
    logs:存放日志
    static:用于存放一些静态文件
    templates:用于存放页面模板
    myreader.db:一个sqlite轻量级数据库

②爬行状态页

输入url,点击查找显示状态,确认无误后下载入库,发射信号重新加载阅读器的目录(只写了爬取起点xx章节链接的功能,如有需要可自行扩展)。

③阅读器页
查到当前有的文章标题,点击显示详情… (详情见代码 loaders和view部分)

④整体作用域和信号设置
在main_controller中实例化所有的窗口,如前面所述,所有的窗口都会在同一个函数作用域中,互相传递窗口实例地址,即可完成多窗口的窗口状态传输。

最终的信号设置以及整体的槽函数写在 allocating的分拨中心里,分拨中心会继承整个main_controller并整合所有的loaders,在这里定义好全局信号,按照需求设置对应槽函数,下发信号和需要操作的窗口。

2 最终结构

代码已上传至 github https://github.com/yejue/myReader
整个工作流程如下,分拨中心继承了主控controller并整合了所有的loaders,在初始化运行时,从主控controller展开所有的子窗口;当子窗口的控件被激活时,调用在分拨中心绑定好的槽函数 ,去做相应的动作,这些操作都应涉及到数据库(不涉及到数据库的通通扔到子窗口的controller),loader接收到views返回的数据后调用controller去变更ui。

Re:PyQt5 从零开始的MVC开发模式规划相关推荐

  1. 方立勋_30天掌握JavaWeb_JavaBean、mvc开发模式、el表达式、jstl标签

    什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法暴露 ...

  2. 五、Web服务器——MVC开发模式 EL表达式 JSTL 学习笔记

    今日内容 1. JSP:1. 指令2. 注释3. 内置对象2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令* 作用:用于配置JSP页面,导入资源文件* ...

  3. 命名规范、MVC 开发模式

    一.高级软件介绍 JDK 7 Eclipse mars2 MySql Navicat 二.数据库 SQL 命令 1 创建数据库并指定编码 Create database 数据库名 default ch ...

  4. java day41【JSP 、MVC开发模式 、EL表达式 、JSTL标签 、三层架构】

    第一章  JSP 1. 指令 * 作用:用于配置JSP页面,导入资源文件 * 格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> * 分类: 1. page : ...

  5. 面试题:什么是MVC开发模式,其优缺点。

    什么是MVC开发模式,其优缺点. 1.什么是MVC设计模式 MVC模式将系统分为视图,模型及控制器,其中控制器作用分离视图和模型,使系统解耦,易于修改和拓展,但同时增加了开发难度. 2.MVC优缺点 ...

  6. JavaWeb之MVC开发模式之商品实例CURD详解

    文章目录 三层MVC开发模式架构 一.先建立目标类对象:Curriculum. 三,过滤层Filter 四.增加商品 4.1 增加前端adds.jsp 4.2 增加的servlet服务 五.删除课程 ...

  7. 学习笔记 --- 工厂、单体、适配器、策略、观察者、MVC设计模式及ASP.NET MVC开发模式、关闭缓存的方法...

    关于工厂.单体.适配器.策略.观察者没啥好说的, 代码中有说明 //DesignPattern.cs View Code using System; using System.Collections. ...

  8. 什么是MVC开发模式?

    全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业 ...

  9. java中mvc开发模式_MVC开发模式

    1.1  MVC模式 1.1.1  MVC模式简介 MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而得到更好的开发和维护效率. 在M ...

最新文章

  1. docker mysql容器 修改时区
  2. spring中自定义Bean的性质
  3. GCN的多层卷积的流程图
  4. 又重装了系统win8+office2013+sql2012+tfs2012+vs2010+vs2012+xna4+kinectsdk1.6+wp8sdk
  5. I00005 打印直角三角形字符图案
  6. Arcgis Javascript那些事儿(七)--AMD详解
  7. c++string类的相关操作
  8. SQL中的Having与Where的区别(面试常问)
  9. oracle有rtf函数,Delphi中对Oracle存取RTF文档(作者:苏涌)
  10. win7系统提示此windows副本不是正版怎么办?
  11. 探秘阿里聚石塔技术架构实现(一)
  12. 百度官方的6个SEO建议
  13. 解除win10防火墙对软件的误杀
  14. 傻瓜式教学——手把手教你电脑三种方式连接打印机
  15. 笔记丨元胞自动机模拟城市扩张过程
  16. 台式机通过笔记本的WIFI上网
  17. 【MySQL运维】使用gh-ost工具实现大表在线DDL变更
  18. 联想电脑insert被默认修改成smart key时使用insert健
  19. 电子计算机是汉字的掘墓人,当人类社会进入到信息时代,曾有人_______,计算机是方块汉字的掘墓人。然 - 问答库...
  20. “耳根”发布新作《一念永恒》,刷新武汉网络文学IP版权交易纪录

热门文章

  1. ASimpleCache开源缓存框架使用之实现抽签小程序
  2. php泛目录站群系统,php泛目录站群
  3. 旺旺qq html,如何在网页HTML中嵌入QQ、MSN、旺旺、Gtalk快速对话框代码
  4. python+selenium自动化能打开火狐浏览器但是打不开网址
  5. 微信小程序云开发—校园动物图鉴
  6. 【毕业设计_课程设计】基于移动设备的眼球追踪技术及其应用(源码+论文)
  7. 校验字符串是否是汉语拼音
  8. 【图片编辑小软件, 在线文件转换器】FastStone Photo Resizer支持批量转换和批量重命名;免费快速在线转换器, 将pdf, 图像, 视频, 文档, 音频, 电子书及压缩等格式相互转换
  9. 腾讯云服务器计费模式包年包月/按量计费/竞价实例选择困难户
  10. 25W三星快充协议芯片,支持支持USB PD 3.0