在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) – 有權取決於您.

這兩個部分基本上是負責 –

  1. 模型 存儲數據,或對其進行引用,並返回個人或記錄的範圍,以及關聯的元數據或 展示 指示.
  2. 看法 從模型請求數據並顯示小部件上返回的內容.

文檔中對QT體系結構進行了深入的討論.

Pyinstaller包裝Python GUI應用程序的完整指南.

Pyinstaller包裝Python應用程序

[[折扣.下一個[折扣.持續時間] [折扣.]]使用代碼[折扣.優惠券代碼]]

購買力奇偶校驗

[[國家]]的開發人員得到[[折扣.discount_pc]]].優惠券代碼]]

一個簡單的模型視圖 – 待辦事項列表

為了演示如何在實踐中使用模型視圖,我們將匯總一個非常簡單的桌面todo列表. 這將包括用於項目列表的QListView,輸入新項目的QlineEdit以及一組按鈕,以添加,刪除或標記項目.

UI

簡單的UI是醜陋的QT創建者,並保存為MainWindow.UI . 茶 .UI文件和所有其他部分可以下載.

在QT創建者中設計一個簡單的TODO應用

在QT創建者中設計一個簡單的TODO應用

運行應用如下所示.

奔跑的todo gui(還沒有任何可用)

奔跑的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顯示硬編碼的托多項目

您可以按照這樣的手動添加項目,它們將按順序顯示在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

標記為完整的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應用程序您可以創建自定義的工作流以標準化重複過程. 立即嘗試並開始控制您的進度.

資源:

  1. 為每張機票創建任務
  2. 進度欄可隨訪可交付
  3. 創建標準化的工作流以提高生產力.
  4. 管理您的任務列表,以使其與日常工作保持聯繫.
  1. 堆疊Todo和Zendesk Sunshine,以獲得有關應用功能的完整訪問權限
  2. 通過創建或編輯任務自動化來提高生產率,並保存您的個性化預設.