在Mac App Store上使用PYQT5 ModelView體系結構來構建簡單的TODO應用程序
ModelView架構QT S類似於MVC的接口,用於在視圖中顯示數據
運行應用如下所示.
托多4+
幾年來,我在iPad,iPhone和MacBookPro上使用了此應用程序. 如果它繼續在iOS上完美運作,似乎尚未完全遵循MacOS的演變.
安裝它沒有問題. 但是,不再有可能在MacOS上與Toodledo同步,而在iOS上仍然可以使用:不識別相同的標識符.
因此,這對我來說是不必要的… Appigo的協助似乎並不急於為我的要求提供答案. 總是不愉快地註意到,客戶的概念每天都會失去更多的價值.
Pisa d
自從此更新以來,我丟失了我的所有清單12,我每天都以專業的方式工作. 我將大約200個景點永久管理,此更新已在磨難的幾個月中進行 ! 列表中組織的所有任務都發現自己分組在一個全球列表中. 當然不是這個錯誤會讓我傳遞給該軟件專業的版本,否則很棒. 我永遠不會被俘虜. 我只需要等待今晚通過電子郵件與之聯繫的支持的響應,然後找到這個宏偉的軟件的舊版本. 我真的希望這是新版本的年輕beug,而不是強迫遷移到付費專業版的策略. 有關信息,我的同步是通過Dropbox完成的
Surlepoint,2011年12月13日
同步現在是鎳
我在同步速度緩慢,走得不好之前就抓住了。. 但是現在有了iCloud,它非常適合我.
一些可能的改進:更多顯示設置.
– 僅顯示用戶使用的內容. 例如,我不使用上下文或標籤(無論如何尚未使用),我想不再顯示以下“污染”我的todo的選項. 我只想有“日期 /優先級 /列表 /鍵入”的日常筆記,右鍵單擊我很少使用的選項
– 相反,我想要一個簡單的plsu顯示,而不是一個drop -down菜單來選擇日期,優先級,列表,…如果我只有三個列表,那麼三個按鈕就足以顯示出來,我可以選擇我的列表單擊一鍵,而不是單擊“ drop -down”菜單,查找名稱,然後單擊它. (同上優先級,尤其是我們從待辦事項列表上的非常視覺繪畫到選項中的名稱選擇,這不是很自然.
這些是人體工程學細節. 我喜歡Todo的簡單性和效率,因此我希望它可以更簡單地配置更簡單.
隱私應用程序
開發人員Appigo尚未提供有關其私人實踐和數據處理的詳細信息. 有關更多信息,請參閱開發項目的隱私政策.
模型視圖體系結構
QT的類似於MVC的接口,用於在視圖中顯示數據
當您開始使用PYQT5構建更複雜的應用程序時. 存儲在小部件中的數據(e.G. 一個簡單的qlistwidget)不容易從python操縱 – 更改要求您獲取項目,獲取數據,然後將其設置回. 默認解決方案是將外部數據表示形式保留在python中,然後對數據和小部件的重複更新,或者簡單地從數據中重寫Wihole Widget. 這可能很快變得醜陋,並導致大量的樣板只是為了擺弄數據.
值得慶幸的是,QT有一個解決方案-ModelViews. ModelViews是標準顯示小部件的強大替代方案,該小部件使用常規模型接口與數據源進行交互 – 從簡單的數據結構到外部數據庫. 這可以隔離您的數據,從而使其保持在您喜歡的任何結構中,而視圖負責演示和更新.
本教程介紹了QT的模型視圖架構的關鍵方面,並使用它來構建PYQT5中的簡單桌面todo應用程序.
模型視圖控制器
模型 – 請參閱 – 控制器 (MVC)是用於開髮用戶界面的建築模式使用,將應用程序分為三個相互聯繫的零件. 這將數據的內部表示與信息的呈現方式分開.
MVC設計Pattenn Fets三個主要組成部分 –
- 模型 持有應用程序正在使用的數據結構.
- 看法 是向用戶顯示的任何信息的任何表示形式,其中圖形或表格. 允許對同一數據模型的多個視圖.
- 控制 接受用戶的輸入,將其轉換為模型或查看的命令.
它QT降落了視圖和控制器之間的區別有些陰暗. QT接受用戶(通過OS)的輸入事件,並將其委派給小部件(控制器)以處理. 但是,小部件還處理當前狀態向用戶的介紹,將其直接放置在視圖中. 在qt-s說話中,視圖和控制器被合併為togd togd togd togd toged/diveconcontroller架構,而不是痛苦地繪製線路繪製線路的繪製。.
重要的是, 數據 和 它是如何呈現的 保存.
模型視圖
該模型充當數據存儲和ViewController之間的接口. 該模型包含數據(或對其引用),並通過標準化的API介紹此數據,然後查看然後消耗並呈現給用戶. 多種視圖可以共享相同的數據,以完全不同的方式呈現.
您可以為模型使用任何“數據存儲”,例如標準的Python列表或字典或數據庫(通過E.G. sqlalchemy) – 有權取決於您.
這兩個部分基本上是負責 –
- 茶 模型 存儲數據,或對其進行引用,並返回個人或記錄的範圍,以及關聯的元數據或 展示 指示.
- 茶 看法 從模型請求數據並顯示小部件上返回的內容.
文檔中對QT體系結構進行了深入的討論.
Pyinstaller包裝Python GUI應用程序的完整指南.
[[折扣.下一個[折扣.持續時間] [折扣.]]使用代碼[折扣.優惠券代碼]]
購買力奇偶校驗
[[國家]]的開發人員得到[[折扣.discount_pc]]].優惠券代碼]]
一個簡單的模型視圖 – 待辦事項列表
為了演示如何在實踐中使用模型視圖,我們將匯總一個非常簡單的桌面todo列表. 這將包括用於項目列表的QListView,輸入新項目的QlineEdit以及一組按鈕,以添加,刪除或標記項目.
UI
簡單的UI是醜陋的QT創建者,並保存為MainWindow.UI . 茶 .UI文件和所有其他部分可以下載.
在QT創建者中設計一個簡單的TODO應用
運行應用如下所示.
奔跑的todo gui(還沒有任何可用)
接口中可用的小部件,我們給出了下表中顯示的ID.
Objeuch | 種類 | 描述 |
---|---|---|
todview | QListView | 當前的Todos列表 |
tododit | qlineedit | 創建新托多商品的文本輸入 |
AddButton | qpushbutton | 創建新的TODO,將其添加到Todos列表中 |
DeleteButton | qpushbutton | 刪除當前選定的托多(Todo),將其從托多斯列表中刪除 |
完整的屁股 | qpushbutton | 標記當前所選的todo如完成 |
我們將使用這些標識符稍後連接應用程序邏輯.
該模型
我們通過從實施中進行子類別來定義我們的自定義模型,從而使我們能夠專注於模型獨特的部分. QT提供了許多不同的型號,包括列表,樹和表(非常適合電子表格).
對於此示例,我們將結果顯示為QListView . 匹配的基本模型是qabstractlistmodel . 我們模型的輪廓定義如下所示.
類todomodel(qtcore.qabstractlistmodel):def __init __(self, *args,todos = none,** kwargs):super(todomodel,self).__init __(*args,** kwargs)自我.todos = todos或[] def data(self,index,crom):如果角色== qt.Displayrole:#請參閱下面的數據結構. 狀態,文字=自我.todos [索引.row()]#僅返回托多文字. 返回文本def rowcount(self,index):返回len(self.戒酒)
茶 .Todos變量是我們的數據存儲,這兩種方法RowCount()和Data()是列表模型必須的標準模型方法. 我們依次在下面瀏覽這些.
.托多斯列表
我們模型的數據存儲是 .Todos,一個簡單的python列表,我們將以格式存儲一個值的元組[(bool,str),(bool,str),(bool,str),(bool,str)],其中布爾是 所以 給定條目的狀態,str是托多的文字.
我們初始化自我.todo到啟動的空列表,除非通過todos關鍵字參數輸入列表.
自己.todos = todos或[]將設置自我.如果是 Truty (我.e. 除空列表外,任何其他內容,布爾值false或默認值),否則將其設置為空列表[] .
為了創造這種模型的限制,我們可以簡單 –
model = todomodel()#創建一個空托多列表
或通過現有列表 –
todos = [(false,'一個項目'),(false,'另一個項目')]模型= todomodel(todos)
.rowcount()
茶 .rowcount()方法是通過視圖來獲取當前數據中的行數的callade. 這是視圖所必需的,以便現在可以重做數據存儲的最大索引(行-1). 銷售我們使用python列表作為數據存儲,此的返回值只是列表的len().
.數據 ()
這是您的模型的核心,該模型可以從視圖中處理數據並返回適當的結果. 它收到兩個參數索引和角色.
索引是視圖所請求的數據的位置/坐標,可通過兩種方法訪問 .row()和 .在每個維度中給出位置的列().
對於我們的qlistView,列始終為0,可以忽略,但是您需要在電子表格視圖中使用此列用於2D數據.
角色是指示 種類 視圖要求的數據. 這是因為 .數據()方法實際上具有更多的責任,而不僅僅是核心數據. 它還處理樣式信息,工具提示,狀態欄等的請求。. – 基礎數據可以通過數據本身告知.
QT的命名.Displayrole有點怪異,但這表明 看法 在問我們“請給我顯示顯示的數據”. 還有其他 角色 數據可以收到用於樣式請求或以“編輯”格式請求數據.
角色 | 價值 | 描述 |
---|---|---|
QT.展示 | 0 | 要以文本形式呈現的關鍵數據. (QString) |
QT.裝飾 | 1 | 以圖標形式渲染的數據作為裝飾. (QCOLOR,QICON或QPIXMAP) |
QT.社論 | 2 | 正式的數據中的數據在編輯器中進行編輯. (QString) |
QT.刀具 | 3 | 該項目工具提示中顯示的數據. (QString) |
QT.Statustiprole | 4 | 狀態欄中顯示的數據. (QString) |
QT.whatsthisrole | 5 | 在“這是什麼”中顯示該項目的數據?“ 時尚. (QString) |
QT.sizehintrole | 13 | 將提供給視圖的項目的大小提示. (QSize) |
有關可用的完整列表 角色 您可以收到QT ITMDatarole文檔. 我們的待辦事項清單只會使用QT.顯示器和QT.裝飾 .
基本實現
下面是加載UI所需的基本存根應用程序. 我們將向此基礎添加模型代碼和應用程序邏輯.
從pyqt5導入系統,qtgui,qtwidgets,uic from pyqt5.QTCORE導入qt_creator_file =“ mainwindow.ui“ ui_mainwindow,qtbaseclass = uic.loaduduype(qt_creator_file)類todomodel(qtcore.qabstractlistmodel):def __init __(self, *args,todos = none,** kwargs):super(todomodel,self).__init __(*args,** kwargs)自我.todos = todos或[] def data(self,index,crom):如果角色== qt.顯示器:狀態,文字=自我.todos [索引.row()]返回文本def rowcount(self,index):返回len(self.Todos)班級MainWindow(QTwidgets.Qmainwindow,ui_mainwindow):def __init __(self):qtwidgets.Qumainwindow.__init __(self)ui_mainwindow.__init __(自我)自我.setupui(自我)自我.模型= todomodel()自我.todview.setModel(self.模型)app = qtwidgets.qapplication(sys.argv)窗口= mainwindow()窗口.show()應用.exec_()
我們像以前一樣定義todomodel,並初始化mainwindow對象. 在__init__ for Mainwindow中,我們創建了一個todo模型的實例,並在todo_view上設置了此模型 . 將此文件保存為todo.py並與 –
python3 todo.步伐
雖然還沒有太多可見的地方,但是QListView和我們的模型實際上在起作用 – 如果添加了一些默認數據,您會看到它顯示在列表中.
自己.model = todomodel(todos = [(false,'我的第一個todo')]))))))))
qlistView顯示硬編碼的托多項目
您可以按照這樣的手動添加項目,它們將按順序顯示在qlistview中 . 接下來,我們將使從應用程序中添加ITM.
首先在名為Add的MainWindow上創建一個新方法 . 這是我們的回調,它將照顧從輸入中添加當前文本作為新的todo. 將此方法連接到addButton.在__init__塊末端的按壓信號.
類MainWindow(Qtwidgets.Qmainwindow,ui_mainwindow):def __init __(self):qtwidgets.Qumainwindow.__init __(self)ui_mainwindow.__init __(自我)自我.setupui(自我)自我.模型= todomodel()自我.todview.setModel(self.型號)#連接按鈕. 自己.AddButton.按.連接(自我.add)def add(self):“”將項目添加到我們的待辦事項列表中,從qlineedit獲取文本 .托迪特和那裡清理. ”“”文字=自我.tododit.text()如果文本:#不要添加空字符串. #通過模型訪問列表. 自己.模型.戒酒.append(((false,text))#觸髮刷新. 自己.模型.佈局變化.emit()#空輸入自我.tododit.setText(“”)
在添加塊中註意線自我.模型.佈局變化.發射 () . 在這裡,我們發出模型信號 .佈局匯合,讓視圖知道 形狀 數據已更改. 這觸發了視圖實體的刷新. 如果您省略此行,仍然會添加TODO,但QListView不會更新.
如果僅更改了數據,但是行/列的數量不受影響,則可以使用 .datachanged()信號. 這也可以使用左上和右下租金定義數據中的一個變化區域,以避免重新繪製整個視圖.
連接其他動作
現在,我們可以連接其餘的按鈕信號,並添加幫助以進行性能 刪除 和 完全的 營運. 我們像以前一樣將按鈕信號添加到__init__塊.
自己.AddButton.按.連接(自我.添加)自我.DeleteButton.按.連接(自我.刪除)自我.完整的屁股.按.連接(自我.完全的)
然後定義一個新的刪除方法如下 –
def delete(self):索引= self.todview.selecteddindexes()如果索引:#索引是單序中單個項目的列表. 索引=索引[0]#刪除項目並刷新. del self.模型.todos [索引.ROW()]自我.模型.佈局變化.emit()#清除選擇(因為它沒有長期有效). 自己.todview.clarselection()
我們使用自我.todview.selectedDIndexes獲取索引(實際上是單個項目的列表,作為我們處於單次選擇模式),然後是 .row()作為我們模型上的托多斯列表的索引. 我們使用Python的Del Operator刪除了索引項目,然後觸發了一個佈局的信號,因為數據的形狀已經修改.
最終,我們清除了主動選擇,因為它與現在相關的項目可能會超出界限(如果您選擇了最後一個項目).
您可以嘗試製作此智能者,然後選擇列表中的最後一項
完全喜歡這樣的方法 –
def完成(self):索引= self.todview.selectredindexes()如果索引:index = indexes [0] row = index.row()狀態,文字=自我.模型.毒[行]自我.模型.todos [row] =(true,text)# .datachanged的最高左和右下是#等於#對於單個選擇. 自己.模型.datachanged.emit(索引,索引)#清除選擇(因為這不是長期有效). 自己.todview.clarselection()
這使用與DELETE相同的索引,但是這次我們從模型中獲取項目 .戒酒列表,然後用true替換狀態 .
我們必須執行此提取和替代,因為我們的數據被存儲為python元組,無法修改.
這裡不同的關鍵與. 標準QT小部件是我們直接更改數據,並且需要簡單地通知QT,以更改haasurd-自動更新小部件狀態.
使用QT.裝飾
如果您現在運行該應用程序,則應發現添加和刪除這兩個工作. 我們需要更新我們的模型,以便在項目完成時為視圖提供指示器. 更新的模型如下所示.
tick = qtgui.qimage('tick.png')類todomodel(qtcore.qabstractlistmodel):def __init __(self, *args,todos = none,** kwargs):super(todomodel,self).__init __(*args,** kwargs)自我.todos = todos或[] def data(self,index,crom):如果角色== qt.displayrole:_,text = self.todos [索引.row()]返回文本,如果角色== qt.裝飾:狀態,_ =自我.todos [索引.row()]如果狀態:返回tick def rowcount(self,index):返回len(self.戒酒)
正在使用tick圖標tick.png指示完整的項目,我們將其加載到名為tick的qimage對像中 . 在模型中,我們為QT施加了一個處理程序.返回狀態為真的行的tick圖標的裝飾物(完整).
我使用的圖標取自P.Yusukekamiyamane
i圖標的intostad您也可以返回顏色,e.G. QTGUI.QCOLOR(’綠色’)將被繪製為實心正方形.
運行該應用程序您現在應該能夠將項目標記為完整.
標記為完整的Todos
持久數據存儲
我們的TODO應用程序效果很好,但是它有一個致命的缺陷- 一旦關閉應用程序,您就會忘記您的狗狗,而當您認為您無事可做的情況下,您可以做出貢獻的短期情感,從而長期,這可能是一個餿主意.
解決方案是實施Persist Data Store的一些郊遊. 最簡單的方法是一個簡單的文件存儲,我們在啟動時從json或泡菜文件中加載項目,然後在更改上寫回去.
為此,我們在手上定義了兩種新方法 . 這些來自JSON文件名數據的加載數據.json(如果存在,則忽略錯誤).模型.招待並寫下當前的自我.模型.分別向同一文件逛逛.
def load(self):嘗試:開放('數據.json','r')作為f:自我.模型.todos = json.load(f)例外例外:Pass Def Save(self):打開('數據).json','w')作為f:data = json.轉儲(自我.模型.毒品,f)
為了堅持數據的更改,我們需要添加 .保存()處理程序到修改數據的任何方法的末尾, .load()處理程序在模型創建之後到__init__塊.
最終代碼看起來像這樣 –
導入SYS從PYQT5導入JSON Import Qtcore,Qtgui,Qtwidgets,UIC,uic from pyqt5.QTCORE導入qt_creator_file =“ mainwindow.ui“ ui_mainwindow,qtbaseclass = uic.loadUseype(qt_creator_file)tick = qtgui.qimage('tick.png')類todomodel(qtcore.qabstractlistmodel):def __init __(self, *args,todos = none,** kwargs):super(todomodel,self).__init __(*args,** kwargs)自我.todos = todos或[] def data(self,index,crom):如果角色== qt.displayrole:_,text = self.todos [索引.row()]返回文本,如果角色== qt.裝飾:狀態,_ =自我.todos [索引.row()]如果狀態:返回tick def rowcount(self,index):返回len(self.Todos)班級MainWindow(QTwidgets.Qmainwindow,ui_mainwindow):def __init __(self):超級(mainwindow,self).__在自身.setupui(自我)自我.模型= todomodel()自我.load()自我.todview.setModel(self.模型)自我.AddButton.按.連接(自我.添加)自我.DeleteButton.按.連接(自我.刪除)自我.完整的屁股.按.連接(自我.完成)def添加(self):“”“將項目添加到我們的待辦事項列表中,從qlineedit獲取文本 .托迪特和那裡清理. ”“”文字=自我.tododit.text()如果文本:#不要添加空字符串. #通過模型訪問列表. 自己.模型.戒酒.append(((false,text))#觸髮刷新. 自己.模型.佈局變化.emit()#空輸入自我.tododit.setText(“”)自我.保存()def delete(self):索引= self.todview.selecteddindexes()如果索引:#索引是單序中單個項目的列表. 索引=索引[0]#刪除項目並刷新. del self.模型.todos [索引.ROW()]自我.模型.佈局變化.emit()#清除選擇(因為它沒有長期有效). 自己.todview.clarselection()自我.save()def完成(self):indexes = self.todview.selectredindexes()如果索引:index = indexes [0] row = index.row()狀態,文字=自我.模型.毒[行]自我.模型.todos [row] =(true,text)# .datachanged的最高左和右下是#等於#對於單個選擇. 自己.模型.datachanged.emit(索引,索引)#清除選擇(因為這不是長期有效). 自己.todview.clarselection()自我.save()def load(self):嘗試:打開('數據.db','r')作為f:自我.模型.todos = json.load(f)例外例外:Pass Def Save(self):打開('數據).db','w')作為f:data = json.轉儲(自我.模型.todos,f)app = qtwidgets.qapplication(sys.argv)窗口= mainwindow()窗口.show()應用.exec_()
如果您的應用程序中的數據有可能獲得大或更複雜的可能性,則可以使用實際數據庫來存儲它. 在這種情況下. LL封面如何在即將到來的教程中做到這一點.
有關QListView的另一個有趣示例,請參閱此示例媒體播放器應用程序. 它使用QT building QMediaPlayList作為數據存儲,其中內容顯示為QListView .
關於BCR.CX:
BCR.CX是一家巴西技術創業公司,專門從事業務外包過程(BPO)和商業環境外包(BEO),主要集中於生成需求,客戶體驗,溝通,用戶支持和滿意度.
描述:
TODO應用程序是一種快速,安全且用戶友好的方式來存儲代理商在工作日中的註釋.
能夠根據每個單獨的機票或客戶創建和管理自己的任務.
創建步道並自定義您的工作流程
生產力提高! 使用TODO應用程序您可以創建自定義的工作流以標準化重複過程. 立即嘗試並開始控制您的進度.
資源:
- 為每張機票創建任務
- 進度欄可隨訪可交付
- 創建標準化的工作流以提高生產力.
- 管理您的任務列表,以使其與日常工作保持聯繫.
- 堆疊Todo和Zendesk Sunshine,以獲得有關應用功能的完整訪問權限
- 通過創建或編輯任務自動化來提高生產率,並保存您的個性化預設.