TODO im Mac App Store mit der PYQT5 ModelView Architecture, um eine einfache Todo -App zu erstellen
Die ModelView Architecture QTs MVC-ähnliche Schnittstelle zum Anzeigen von Daten in Ansichten
Contents
- 1 Die ModelView Architecture QTs MVC-ähnliche Schnittstelle zum Anzeigen von Daten in Ansichten
- 1.1 Todo 4+
- 1.2 Datenschutz -App
- 1.3 Die ModelView Architecture Die MVC-ähnliche Schnittstelle von QT zum Anzeigen von Daten in Ansichten
- 1.4 Model View Controller
- 1.5 Die Modellansicht
- 1.6 Eine einfache Modellansicht – eine Todo -Liste
- 1.7 Ein persistierter Datenspeicher
- 1.8 Über BCR.CX:
- 1.9 Beschreibung:
- 1.10 Ressourcen:
Die laufende App ist unten gezeigt.
Todo 4+
Seit einigen Jahren habe ich diese Anwendung auf meinem iPad, meinem iPhone und meinem MacBookpro verwendet. Wenn es weiterhin perfekt auf iOS funktioniert, scheint es, dass es der Entwicklung von MacOS nicht vollständig verfolgt hat.
Keine Probleme bei der Installation. Es ist jedoch nicht mehr möglich, mit Toodledo auf MacOS zu synchronisieren, während es auf iOS weiterhin möglich ist: Die gleichen Kennungen werden nicht erkannt.
Es wird daher für mich unnötig … und die Unterstützung von Appigo scheint es nicht eilig zu haben, eine Antwort auf meine Anfrage zu geben. Es ist immer unangenehm festzustellen, dass das Konzept des Kunden jeden Tag etwas mehr von seinem Wert verliert.
Pisa d
Seit diesem Update habe ich alle meine Listen in der Anzahl 12 verloren und mit denen ich täglich professionell arbeite. Ich verwalte ungefähr 200 Plätze dauerhaft. Dieses Update hat die Monate der Tortur auf die Bodenmonate gesetzt ! Alle in der Liste organisierten Aufgaben befanden sich in einer einzigen globalen Liste. Es ist sicherlich nicht dieser Fehler, der mich dazu bringt, an die Version zu gelangen, die professionell dieser Software sagt, sonst hervorragend ausgezeichnet. Ich werde niemals gefangen sein. Es bleibt nur für mich, auf die Antwort des heute Abend kontaktierten Supports per E -Mail zu warten oder dann die alte Version dieser großartigen Software zu finden. Ich hoffe sehr. Für Informationen wird meine Synchronisation mit Dropbox durchgeführt
Surlepoint, 13.12.2011
Die Synchronisation ist jetzt Nickel
Ich griff nach der Synchronisation, die langsam, schlecht ging, usw. Aber jetzt mit iCloud passt es perfekt zu mir.
Einige mögliche Verbesserungen: Weitere Anzeigeneinstellungen.
– um nur das anzuzeigen, was der Benutzer verwendet. Zum Beispiel verwende ich keine Kontexte oder Etiketten (auf jeden Fall noch nicht) und möchte diese Optionen nicht mehr anzeigen, die mein Todo “verschmutzen”. Ich möchte nur “Datum / Priorität / Liste / Typ” für meine alltäglichen Notizen und mit der rechten Maustaste für die Optionen, die ich selten verwende
– Und umgekehrt möchte ich eine einfache PLSU -Anzeige als ein Drop -Down -Menü, um Datum, Priorität, Liste, … Wenn ich nur drei Listen habe, würden drei Schaltflächen ausreichen, um angezeigt zu werden, und ich könnte meine Liste auswählen Suchen Sie den Namen und klicken. (dito für Priorität, insbesondere, dass wir von einer sehr visuellen Zeichnung auf der Todo -Liste zu einer Namenswahl in den Optionen gehen, die nicht sehr natürlich sind.
Dies sind Ergonomiedetails. Ich mag die Einfachheit und die Effizienz von Todo, also möchte ich, dass es noch konfigurierbarer sein kann, noch einfacher zu sein.
Datenschutz -App
Der Entwickler Appigo hat keine Einzelheiten zu seinen Privatpraktiken und zur Handhabung von Daten an Apple bereitgestellt. Weitere Informationen finden Sie in der Datenschutzrichtlinie der Entwicklung.
Die ModelView Architecture
Die MVC-ähnliche Schnittstelle von QT zum Anzeigen von Daten in Ansichten
Wenn Sie beginnen, komplexere Anwendungen mit PYQT5 zu erstellen, stoßen Sie wahrscheinlich darauf, Widgets mit Ihren Daten synchronisieren zu halten. Daten, die in Widgets gespeichert sind (e.G. Ein einfaches QListWidget) ist nicht ohne weiteres verfügbar, um von Python aus zu manipulieren – Änderungen müssen Sie ein Element abrufen, die Daten abrufen und dann zurückstellen. Die Standardlösung hier. Dies kann schnell hässlich werden und führt zu viel Boilerplate, nur um die Daten zu fummeln.
Zum Glück hat QT eine Lösung dafür – ModelViews. ModelViews sind eine leistungsstarke Alternative zu den Standard -Anzeige -Widgets, die eine reguläre Modellschnittstelle verwenden, um mit Datenquellen zu interagieren – von einfachen Datenstrukturen bis zu externen Datenbanken. Dies isoliert Ihre Daten und ermöglicht es, in jeder Struktur zu bleiben, die Ihnen gefällt, während die Ansicht um Präsentationen und Updates kümmert.
In diesem Tutorial werden die wichtigsten Aspekte der ModelView -Architektur von QT vorgestellt und erstellt eine einfache Desktop -Todo -Anwendung in PYQT5.
Model View Controller
Modell – siehe – Controller (MVC) ist eine architektonische Musteranwendung für Entwicklung von Benutzeroberflächen, die eine Anwendung in drei miteinander verbundene Teile unterteilt. Dadurch wird die interne Darstellung von Daten getrennt, wie Informationen vom Benutzer präsentiert und akzeptiert werden.
Das MVC -Design Pattenn FETs drei Hauptkomponenten –
- Modell Hält die Datenstruktur, mit der die App arbeitet.
- Sicht ist eine Darstellung von Informationen, wie dem Benutzer gezeigt, wobei grafisch oder Tabelle gezeigt. Mehrere Ansichten desselben Datenmodells sind zulässig.
- Kontrolle Akzeptiert die Eingabe vom Benutzer und verwandelt sie in Befehle für das Modell oder die Ansicht in Befehle.
Es landet die Unterscheidung zwischen der Ansicht und Controller wird ein wenig trübe. QT akzeptiert Eingabeereignisse vom Benutzer (über das Betriebssystem) und delegiert diese an die Widgets (Controller), um sie zu verarbeiten. Widgets verarbeiten jedoch auch die Präsentation des aktuellen Status an den Benutzer. Anstatt sich darüber zu quälen.
Wichtig ist, dass die Unterscheidung zwischen dem Daten Und Wie es präsentiert wird ist erhalten.
Die Modellansicht
Das Modell fungiert als Schnittstelle zwischen dem Datenspeicher und dem ViewController. Das Modell enthält die Daten (oder einen Verweis darauf) und präsentiert diese Daten über eine standardisierte API, die dann den Benutzer konsumiert und vorhanden ist. Mehrere Ansichten können dieselben Daten teilen und diese auf völlig unterschiedliche Weise präsentieren.
Sie können jeden “Datenspeicher” für Ihr Modell verwenden, beispielsweise eine Standard -Python -Liste oder ein Standard -Wörterbuch oder eine Datenbank (via E).G. SQLALCHEMY) – Es ist berechtigt zu Ihnen.
Die beiden Teile sind im Wesentlichen verantwortlich für –
- Tee Modell Speichert die Daten oder einen Verweis darauf und gibt individuelle oder Datensätze und zugehörige Metadaten oder zurück Anzeige Anweisungen.
- Tee Sicht Fordert Daten aus dem Modell an und zeigt das an, was im Widget zurückgegeben wird.
In der Dokumentation wird die QT-Architektur detailliert erörtert.
Die vollständige Anleitung zur Verpackung von Python -GUI -Anwendungen mit Pyinstaller.
[[Rabatt.Rabatt_PC]]% Rab für den nächsten [Rabatt.Dauer]] [Rabatt.Beschreibung]] mit dem Code [Rabatt.Gutscheincode]]
Kaufkraftparität
Entwickler in [Land]] erhalten [Rabatt.Rabatt_PC]]] AUS für alle Bücher und Kurse mit Code [Rabatt.Gutscheincode]]
Eine einfache Modellansicht – eine Todo -Liste
Um zu demonstrieren, wie die ModelViews in der Praxis verwendet werden, werden wir eine sehr einfache Implementierung einer Desktop -Todo -Liste zusammenstellen. Hier.
Die UI
Die einfache Benutzeroberfläche war hässlicher QT -Schöpfer und als Hauptwindow gerettet.ui . Tee .UI -Datei und alle anderen Teile können unten heruntergeladen werden.
Entwerfen einer einfachen Todo -App in QT Creator
Die laufende App ist unten gezeigt.
Die laufende Todo -GUI (noch nichts funktioniert)
Die in der Schnittstelle verfügbaren Widgets haben die in der folgenden Tabelle gezeigten IDs angegeben.
OBJeuch | Art | Beschreibung |
---|---|---|
Todview | QlistView | Die Liste der aktuellen Todos |
Tododit | QlineEdit | Die Texteingabe zum Erstellen eines neuen Todo -Elements |
Addbutton | Qpushbutton | Erstellen Sie das neue Todo und fügen Sie ihn zur Todos -Liste hinzu |
Deletebutton | Qpushbutton | Löschen Sie das aktuell ausgewählte Todo und entfernen Sie ihn aus der Todos -Liste |
Komplettes Button | Qpushbutton | Markieren Sie den aktuell ausgewählten Todo wie getan |
Wir werden diese Kennungen verwenden, um die Anwendungslogik später anzuschließen.
Das Model
Wir definieren unser benutzerdefiniertes Modell, indem wir von der Implementierung subklassigen. QT leistet eine Reihe verschiedener Modellbasen, einschließlich Listen, Bäume und Tabellen (ideal für Tabellenkalkulationen).
In diesem Beispiel zeigen wir das Ergebnis einer QlistView an . Das passende Basismodell dafür ist QabstractListModel . Die Umrissdefinition für unser Modell ist unten gezeigt.
Klasse todomodel (qtcore.QabstractListModel): def __init __ (Selbst, *args, todos = keine, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) selbst.todos = todos oder [] def data (self, index, rolle): wenn rollen == qt.DisplayRole: # siehe unten für die Datenstruktur. Status, Text = Selbst.Todos [Index.Row ()] # gibt nur den todo -text zurück. Text Def rowCount zurückgeben (Selbst, Index): Return len (self.todos)
Tee .TODOS -Variable ist unser Datenspeicher und die beiden Methoden RowCount () und Data () sind Standardmodellmethoden, die wir für ein Listenmodell müssen. Wir werden diese wiederum durch diese durchgehen.
.TODOS -Liste
Der Datenspeicher für unser Modell ist .Todos, eine einfache Python -Liste, in der wir ein Tupel von Werten im Format speichern [(bool, str), (bool, str), (bool, str)], wo bool der ist daher Zustand eines bestimmten Eintrags und Str ist der Text des Todo.
Wir initialisieren sich selbst.TODO zu einer leeren Liste beim Start, es sei denn.
selbst.todos = todos oder [] setzt sich selbst.todos zum bereitgestellten todoswert, wenn er ist Truty (ich.e. Alles andere als eine leere Liste, der boolesche falsche oder nicht der Standardwert), sonst wird es auf die leere Liste [] gesetzt [] .
Um eine Einung dieses Modells zu erstellen, können wir einfach –
Model = todomodel () # Erstellen einer leeren Todoliste
Oder um eine vorhandene Liste zu übergeben –
todos = [(falsch, 'ein Element'), (falsch, 'ein anderes Element')] model = todomodel (todos)
.Reihenanzahl ()
Tee .RowCount () -Methode wird von der Ansicht Callade erfolgt, um die Anzahl der Zeilen in den aktuellen Daten zu erhalten. Dies ist für die Ansicht in jetzt den maximalen Index erforderlich, den der Datenspeicher wiederholen kann (Zeilenccount-1). Verkauf Wir verwenden eine Python -Liste als Datenspeicher. Der Rückgabewert dafür ist einfach der Len () der Liste.
.Daten ()
Dies ist der Kern Ihres Modells, der Anfragen nach Daten aus der Ansicht übernimmt und das entsprechende Ergebnis zurückgibt. Es empfängt zwei Parameterindex und Rolle.
Der Index ist die Position/Koordinaten der Daten, die die Ansicht verlangt, und zugänglich mit zwei Methoden .Row () und .Spalte (), die die Position in jeder Dimension geben.
Für unsere QListView ist die Spalte immer 0 und kann ignoriert werden, aber Sie müssten dies für 2D -Daten in einer Tabellenkalkulationsansicht verwenden.
Rolle ist eine Flagge, die die angibt Art von Daten, die die Ansicht verlangt. Das liegt daran, dass die .Data () -Methode hat tatsächlich mehr Verantwortung als nur die Kerndaten. Es wird auch Anfragen nach Stilinformationen, Tooltips, Statusleisten usw. behandelt. – basal alles, was durch die Daten selbst informiert werden könnte.
Die Benennung von Qt.DisplayRole ist etwas seltsam, aber dies zeigt, dass die Sicht fragt uns “Bitte geben Sie mir Daten zur Anzeige”. Da sind andere Rollen Welche Daten können für Stylinganfragen oder Anfragen von Daten im “Bearbeiten-fähigen” Format empfangen werden.
Rolle | Wert | Beschreibung |
---|---|---|
Qt.Anzeige | 0 | Die wichtigsten Daten, die in Form von Text wiedergegeben werden sollen. (Qstring) |
Qt.Dekoration | 1 | Die Daten, die als Dekoration in Form eines Symbols zu ertragen sind. (Qcolor, Qicon oder qpixmap) |
Qt.Redaktionell | 2 | Die Daten in einer formalen Bearbeitung in einem Herausgeber folgen zur Bearbeitung. (Qstring) |
Qt.Tooltiprole | 3 | Die im Tooltip des Elements angezeigten Daten. (Qstring) |
Qt.Statustiprole | 4 | Die in der Statusleiste angezeigten Daten. (Qstring) |
Qt.Whatthisrol | 5 | Die für das Element angezeigten Daten in “Was ist das?”Mode. (Qstring) |
Qt.Größeneintrole | 13 | Die Größe Hinweis für den Artikel, der den Ansichten zur Verfügung gestellt wird. (QSIZE) |
Für eine vollständige Liste der verfügbaren Rollen Sie können erhalten. Unsere Todo -Liste verwendet nur QT.DisplayRole und Qt.Dekoration .
Grundlegende Implementierung
Unten finden Sie die grundlegende Stubanwendung, die zum Laden der Benutzeroberfläche und der Anzeige erforderlich ist. Wir werden unsere Modellcode und unsere Anwendungslogik dieser Basis hinzufügen.
Import sys von pyqt5 import qtcore, qtgui, qtwidgets, uic von pyqt5.Qtcore import qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = UIC.LoadUduype (qt_creator_file) class todomodel (qtcore.QabstractListModel): def __init __ (Selbst, *args, todos = keine, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) selbst.todos = todos oder [] def data (self, index, rolle): wenn rollen == qt.DisplayRole: Status, text = self.Todos [Index.Row ()] return text def rowCount (self, index): return len (self.Todos) Klasse Mainwindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.QumainWindow.__init __ (self) ui_mainwindow.__init __ (selbst) Selbst.Setupui (Selbst) Selbst.Modell = todomodel () self.Todview.SetModel (self.Modell) app = qtwidgets.Qapplication (sys.ARGV) Fenster = MainWindow () Fenster.Show () App.Exec_ ()
Wir definieren unser Todomodel wie zuvor und initialisieren das MainWindow -Objekt. Im __init__ für den MainWindow erstellen wir eine Instanz unseres Todo -Modells und setzen dieses Modell auf der Todo_View . Speichern Sie diese Datei als Todo.Py und rennen Sie es mit –
Python3 Todo.Tempo
Obwohl es noch nicht viel zu sehen ist, funktionieren die QlistView und unser Modell tatsächlich. Wenn Sie einige Standarddaten hinzufügen, werden sie angezeigt, dass es in der Liste angezeigt wird.
selbst.model = todomodel (todos = [(Falsch, 'mein erster Todo'))))))
QlistView zeigt hartcodiertes TODO-Element
Sie können weiterhin manuell wie diese addieren und sie werden in der qlistView angezeigt . Als nächstes werden wir es ermöglichen, ITMS aus der Anwendung aus hinzuzufügen.
Erstellen Sie zunächst eine neue Methode auf dem MainWindow namens Add Add . Dies ist unser Rückruf, der sich um das Hinzufügen des aktuellen Textes aus der Eingabe als neues Todo kümmert. Verbinden Sie diese Methode mit dem Addbutton.Gedrücktes Signal am Ende des __init__ Blocks.
Hauptwindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.QumainWindow.__init __ (self) ui_mainwindow.__init __ (selbst) Selbst.Setupui (Selbst) Selbst.Modell = todomodel () self.Todview.SetModel (self.Modell) # Schließen Sie die Taste an. selbst.Addbutton.Drücken Sie.Verbinden (Selbst.Add) def Add (Selbst): "" Fügen Sie unserer Todo -Liste einen Element hinzu, wobei der Text vom QlineEdit abgerufen wird .Todoedit und dort räumen. "" "text = self.Tododit.Text () wenn text: # fügen Sie keine leeren Zeichenfolgen hinzu. # Greifen Sie über das Modell auf die Liste zu. selbst.Modell.Todos.Append ((false, text)) # auslösen Aktualisierung. selbst.Modell.Layoutchanged.Emit () # leeren Sie das Eingangs selbst.Tododit.Text setzen ("")
Im Block hinzufügen Beachten Sie das Linien -Selbst.Modell.Layoutchanged.Emit () . Hier senden wir ein Modellsignal aus .Layoutchanged, damit die Ansicht wissen, dass die Form der Daten wurde verändert. Dies löst eine Auffrischung der Einheit der Sicht aus. Wenn Sie diese Zeile weglassen, wird das Todo weiterhin hinzugefügt, aber die QlistView wird nicht aktualisiert.
Wenn nur die Daten geändert werden, aber die Anzahl der Zeilen/Spalten nicht betroffen ist, können Sie die verwenden .Dataachanged () Signal stattdessen. Dies definiert auch eine veränderte Region in den Daten mit einer oberen links- und unteren Rechten, um die gesamte View-Ansicht neu zu zeichnen.
Die anderen Aktionen anschließen
Wir können jetzt den Rest der Signale der Taste anschließen und Hilfe für die Leistung hinzufügen löschen Und vollständig Operationen. Wir fügen die Schaltflächensignale zum __init__ -Block wie zuvor hinzu.
selbst.Addbutton.Drücken Sie.Verbinden (Selbst.Hinzufügen) Selbst.Deletebutton.Drücken Sie.Verbinden (Selbst.Löschen) Selbst.Komplettes Button.Drücken Sie.Verbinden (Selbst.Vollständig)
Definieren Sie dann eine neue Methode wie folgt – wie folgt –
Def delete (self): indizes = self.Todview.SelectedDindexes () Wenn Indexes: # Indexes eine Liste eines einzelnen Elements in Einzelauswahl ist. Index = Indexes [0] # Entfernen Sie das Element und aktualisieren Sie. Del Selbst.Modell.Todos [Index.Row ()] Selbst.Modell.Layoutchanged.EMIT () # Löschen Sie die Auswahl (da sie nicht lange gültig ist). selbst.Todview.Klarheit ()
Wir benutzen Selbst.Todview.SelectedDIndexes, um die Indizes (tatsächlich eine Liste eines einzelnen Elements wie wir im Einzelauswahlmodus) und dann der .Row () als Index in unsere Liste der Todos in unserem Modell. Wir löschen das indizierte Element mit dem Del -Operator von Python und dann ein Layoutchanged -Signal aus, da die Form der Daten geändert wurde.
Finallly löschen wir die aktive Auswahl seit dem Element, auf das sie sich nun außerhalb der Grenzen bezieht (wenn Sie das letzte Element ausgewählt haben).
Sie können versuchen, diesen Smartter zu machen und stattdessen das letzte Element in der Liste auszuwählen
Die vollständige Methode mag so –
Def vollständig (Selbst): Indexes = Selbst.Todview.selectredIndexes () wenn Indexes: Index = Index [0] Row = Index.Row () Status, text = self.Modell.Todos [Reihe] Selbst.Modell.Todos [row] = (true, text) # .Dataachanged nimmt oben links und unten rechts ein, was für eine einzelne Auswahl gleich # ist. selbst.Modell.dataTaHANGED.Emit (Index, Index) # Löschen Sie die Auswahl (da sie nicht lange gültig ist). selbst.Todview.Klarheit ()
Dies verwendet dieselbe Indizierung wie für das Löschen, aber diesmal holen wir das Element aus dem Modell .Todos -Liste und dann den Status durch True ersetzen .
Wir müssen dies durch Fetch-and-Replacement tun, da unsere Daten als Python-Tupel gespeichert werden, die nicht modifiziert werden können.
Der Schlüssel, der hier unterschiedlich ist vs. Standard -QT -Widgets ist, dass wir direkt in unsere Daten ändern und qt einfach benachrichtigen müssen, die sich ändert.
Verwenden von Qt.Dekoration
Wenn Sie die Anwendung jetzt ausführen, sollten Sie feststellen, dass das Hinzufügen und Löschen beider Funktionen funktioniert. Während des Ausfüllens von Elementen funktioniert jedoch kein Hinweis darauf in der Ansicht. Wir müssen unser Modell aktualisieren, um die Ansicht mit einem Indikator anzuzeigen, wenn ein Element abgeschlossen ist. Das aktualisierte Modell ist unten gezeigt.
tick = qtgui.Qimage ('Tick.png ') Klasse todomodel (qtcore.QabstractListModel): def __init __ (Selbst, *args, todos = keine, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) selbst.todos = todos oder [] def data (self, index, rolle): wenn rollen == qt.DisplayRole: _, text = self.Todos [Index.Row ()] text zurückgeben, wenn rollen == qt.DecorationRole: Status, _ = Selbst.Todos [Index.Row ()] Wenn Status: Tick Def RowCount zurückgeben (Selbst, Index): Return len (self.todos)
Verwendeten ein Zeckensymbol Tick.PNG, um vollständige Elemente anzugeben, die wir in ein Qimage -Objekt namens Tick laden . Im Modell haben wir einen Handler für das QT implementiert.DecorationRole, das das Zeckensymbol für Zeilen zurückgibt, der der Status von REIS ist (für die vollständige).
Das von P verwendete Symbol, das ich verwende.Yusukekamiyamane
Intostad eines I -Symbols Sie können auch zur Farbe zurückkehren, e.G. Qtgui.Qcolor (‘grün’), das als festes Quadrat gezeichnet wird.
Ausführen der App Sie sollten jetzt in der Lage sein, Elemente als vollständig zu markieren.
TODOS markiert komplett
Ein persistierter Datenspeicher
Unsere Todo-App funktioniert gut, aber sie hat einen tödlichen Fehler-es vergisst Ihre Todos, sobald Sie die Anwendung schließen, während Sie denken, Sie hätten nichts zu tun, wenn Sie Mai tun, um zu kurzfristigen Zen-Gefühlen beizutragen, langfristig ist es wahrscheinlich ein schlechte Idee.
Die Lösung besteht darin, einen gewissen Ausflug des persistenten Datenspeichers zu implementieren. Der einfachste Ansatz ist ein einfacher Dateispeicher, in dem wir Elemente aus einer JSON- oder Gurkendatei beim Start laden und auf Änderung zurückschreiben.
Dazu definieren wir zwei neue Methoden auf unserer Hand . Diese laden Daten aus einem JSON -Dateinamendaten.JSON (wenn es existiert und den Fehler ignoriert, wenn er es nicht tut) an sich selbst.Modell.Todos und schreibe das aktuelle Selbst.Modell.TODOS in dieselbe Datei.
Def Load (Selbst): Versuchen Sie: mit Open ('Daten.Json ',' r ') als F: Selbst.Modell.Todos = json.Laden (f) Ausnahme ausnahm.json ',' w ') als f: data = json.Dump (Selbst.Modell.todos, f)
Um die Änderungen an den Daten zu bestehen, müssen wir die hinzufügen .Save () Handler bis zum Ende einer beliebigen Methode, die die Daten ändert, und die .Load () Handler zum __init__ Block nach dem Erstellen des Modells.
Der endgültige Code sieht so aus – –
Import SYS Import JSON von PYQT5 Import Qtcore, Qtgui, Qtwidgets, UIC aus Pyqt5.Qtcore import qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = UIC.LoadUdUseTyp (qt_creator_file) tick = qtgui.Qimage ('Tick.png ') Klasse todomodel (qtcore.QabstractListModel): def __init __ (Selbst, *args, todos = keine, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) selbst.todos = todos oder [] def data (self, index, rolle): wenn rollen == qt.DisplayRole: _, text = self.Todos [Index.Row ()] text zurückgeben, wenn rollen == qt.DecorationRole: Status, _ = Selbst.Todos [Index.Row ()] Wenn Status: Tick Def RowCount zurückgeben (Selbst, Index): Return len (self.Todos) Klasse Mainwindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): super (Mainwindow, Selbst).__Init __ () Selbst.Setupui (Selbst) Selbst.Modell = todomodel () self.Load () self.Todview.SetModel (self.Modell) Selbst.Addbutton.Drücken Sie.Verbinden (Selbst.Hinzufügen) Selbst.Deletebutton.Drücken Sie.Verbinden (Selbst.Löschen) Selbst.Komplettes Button.Drücken Sie.Verbinden (Selbst.Vollständige) Def Add (Selbst): "" "" "" In unserer Todo -Liste ein Element hinzufügen, wobei der Text vom QlineEdit abgerufen wird .Todoedit und dort räumen. "" "text = self.Tododit.Text () wenn text: # fügen Sie keine leeren Zeichenfolgen hinzu. # Greifen Sie über das Modell auf die Liste zu. selbst.Modell.Todos.Append ((false, text)) # auslösen Aktualisierung. selbst.Modell.Layoutchanged.Emit () # leeren Sie das Eingangs selbst.Tododit.SetText ("") Selbst.Save () def delete (self): indizes = self.Todview.SelectedDindexes () Wenn Indexes: # Indexes eine Liste eines einzelnen Elements in Einzelauswahl ist. Index = Indexes [0] # Entfernen Sie das Element und aktualisieren Sie. Del Selbst.Modell.Todos [Index.Row ()] Selbst.Modell.Layoutchanged.EMIT () # Löschen Sie die Auswahl (da sie nicht lange gültig ist). selbst.Todview.Klarheit () Selbst.Save () def vollständig (Selbst): Indexes = self.Todview.selectredIndexes () wenn Indexes: Index = Index [0] Row = Index.Row () Status, text = self.Modell.Todos [Reihe] Selbst.Modell.Todos [row] = (true, text) # .Dataachanged nimmt oben links und unten rechts ein, was für eine einzelne Auswahl gleich # ist. selbst.Modell.dataTaHANGED.Emit (Index, Index) # Löschen Sie die Auswahl (da sie nicht lange gültig ist). selbst.Todview.Klarheit () Selbst.Save () def geladen (selbst): Versuchen Sie: mit offen ('Daten.db ',' r ') als F: Selbst.Modell.Todos = json.Laden (f) Ausnahme ausnahm.db ',' w ') als f: data = json.Dump (Selbst.Modell.todos, f) app = qtwidgets.Qapplication (sys.ARGV) Fenster = MainWindow () Fenster.Show () App.Exec_ ()
Wenn die Daten in Ihrer Anwendung das Potenzial haben, groß oder komplexer zu werden, können Sie eine tatsächliche Datenbank verwenden, um sie zu speichern. In diesem Fall wickelt das Modell die Schnittstelle in die Datenbank ein und stellt sie direkt ab, damit Daten angezeigt werden sollen. Das L’ll -Cover, wie man dies in einem bevorstehenden Tutorial macht.
Für ein weiteres interessantes Beispiel für eine QListView finden Sie diese Beispiel für Media Player -Anwendung. Es verwendet die QT -Erstellung qmediaPlist als Datenspeicher, wobei der Inhalt in einer QlistView angezeigt wird .
Über BCR.CX:
BCR.CX ist ein brasilianisches Technologie -Startup, das sowohl auf Business Outsourcing Processs (BPO) als auch auf das Outsourcing (Business Environment Outsourcing) (BEO) spezialisiert ist und sich hauptsächlich auf die Erzeugung von Nachfrage, Kundenerfahrung, Kommunikation, Benutzerunterstützung und Zufriedenheit konzentriert.
Beschreibung:
Die Todo-App wurde als schneller, sicherer und benutzerfreundlicher Weg entwickelt, um die Notizen des Agenten während der Arbeitstage zu speichern.
In der Lage sein, Ihre eigenen Aufgaben zu erstellen und zu verwalten, basierend auf jedem einzelnen Ticket oder Kunden.
Erstellen Sie Trails und passen Sie Ihren Workflow an
Produktivität verbessert! Mit der Todo -App können Sie angepasste Workflows erstellen, um wiederholte Prozesse zu standardisieren. Versuchen Sie es jetzt und beginnen.
Ressourcen:
- Erstellen Sie Aufgaben für jedes Ticket
- Fortschrittsbal
- Erstellen Sie standardisierte Workflows, um die Produktivität zu verbessern.
- Verwalten Sie Ihre Aufgabenliste, um mit Ihrem täglichen Routine auf dem Laufenden zu bleiben.
- Stapeln Sie sowohl Todo als auch Zendesk Sunshine, um den App -Zugriff auf die App -Funktionen zu erhalten
- Verbessern Sie die Produktivität durch Erstellen oder Bearbeiten von Aufgaben Automatisierungen und speichern Sie Ihre personalisierten Voreinstellungen.