前言
初次接觸較大型的軟體開發專案,找了幾天可參照的專案無果,于是自己模仿django中的結構來做一個MVC開發模式規劃,也有點閉門造車的意思,如有其他好的辦法分享,下方評論見,
(本篇文章從零開始,以開發一個小應用的視角分享我的MVC規劃)
- 前言
- 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_test
class 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,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/193148.html
標籤:其他
