Todo in de Mac App Store, met behulp van de PYQT5 ModelView -architectuur om een ​​eenvoudige TODO -app te bouwen

De ModelView Architecture QT S MVC-achtige interface voor het weergeven van gegevens in weergaven

De running -app wordt hieronder weergegeven.

Todo 4+

Gedurende enkele jaren gebruikte ik deze applicatie op mijn iPad, mijn iPhone en mijn MacBookPro. Als het perfect blijft werken op iOS, lijkt het erop dat het de evolutie van macOS niet volledig heeft gevolgd.
Geen problemen om het te installeren. Maar het is niet langer mogelijk om te synchroniseren met Todledo op macOS, terwijl het mogelijk blijft op iOS: dezelfde identificaties worden niet herkend.
Het wordt daarom onnodig voor mij … en de hulp van Appigo lijkt geen haast te hebben om een ​​antwoord op mijn verzoek te geven. Het is altijd onaangenaam om op te merken dat het concept van de klant elke dag iets meer van zijn waarde verliest.

Pisa D

Sinds deze update heb ik al mijn lijsten verloren in het nummer van 12 en waarmee ik dagelijks op een professionele manier werk. Ik beheert ongeveer 200 plekken permanent, deze update heeft maanden van beproeving op de grond gezet ! Alle taken georganiseerd in de lijst bevonden zich gegroepeerd in één globale lijst. Het is zeker niet deze bug die me zal laten doorgeven aan de versie die de professional van deze software anders uitstekend zegt. Ik zal nooit gevangen zijn. Het blijft alleen maar voor mij om te wachten op de reactie van de ondersteuning die vanavond contact heeft opgenomen per e -mail of vervolgens de oude versie van deze prachtige software te vinden. Ik hoop echt dat het een jeugdige Bugug van de nieuwe versie is en geen strategie om te migreren naar de betaalde Pro -versie om functionaliteiten te vinden die al met de vorige versie zijn verkregen. Voor info is mijn synchronisatie gedaan met Dropbox

Surlepoint, 13/12/2011

De synchro is nu nikkel

Ik greep vóór de synchronisatie die langzaam was, slecht liep, enz. Maar nu bij iCloud past het perfect bij mij.

Enkele mogelijke verbeteringen: meer display -instellingen.
– Om alleen weer te geven wat de gebruiker gebruikt. Ik gebruik bijvoorbeeld geen contexten of labels (in elk geval nog niet) en ik wil deze opties niet langer weergeven die mijn todo “vervuilen”. Ik zou graag alleen “datum / prioriteit / lijst / type” willen hebben voor mijn dagelijkse notities en klik met de rechtermuisknop voor de opties die ik zelden gebruik
– En omgekeerd wil ik een eenvoudig PLSU -display dan een drop -down -menu om de datum, prioriteit, lijst, … als ik slechts drie lijsten heb, dan zouden drie knoppen voldoende zijn om te worden weergegeven, en ik zou mijn lijst kunnen kiezen Met één klik in plaats van op het menu Drop -down te klikken, zoek de naam en klik erop. (Idem voor prioriteit, vooral dat we van een zeer visuele tekening op de TODO -lijst gaan naar een naamkeuze in de opties die niet erg natuurlijk is.

Dit zijn ergonomische details. Ik hou van de eenvoud en de efficiëntie van Todo, dus ik zou graag willen dat het nog meer configureerbaar kan zijn om nog eenvoudiger te zijn.

Privacy -app

De ontwikkelaar, Appigo, heeft geen details verstrekt over zijn privépraktijken en het omgaan met gegevens aan Apple. Zie het privacybeleid van de ontwikkeling voor meer informatie.

De ModelView -architectuur
QT’s MVC-achtige interface voor het weergeven van gegevens in weergaven

Naarmate u begint met het bouwen van meer complexe applicaties met PYQT5, komt u waarschijnlijk tegen om widgets in synchronisatie te houden met uw gegevens. Gegevens opgeslagen in widgets (E.G. een eenvoudige QlistWidget) is niet direct beschikbaar om te manipuleren vanuit Python – wijzigingen vereisen dat u een item krijgt, de gegevens krijgt en deze vervolgens instelt. De standaardoplossing hiervoor is om een ​​externe gegevensrepresentatie in Python te bewaren, en vervolgens duplicate updates voor zowel de gegevens als de widget, of eenvoudigweg de wihole -widget van de gegevens te herschrijven. Dit kan snel lelijk worden en resulteert in veel boilerplate alleen voor het prutsen van de gegevens.

Gelukkig heeft QT een oplossing hiervoor – ModelViews. ModelViews zijn een krachtig alternatief voor de standaard display -widgets, die een reguliere modelinterface gebruiken om te interageren met gegevensbronnen – van eenvoudige gegevensstructuren tot externe databases. Dit isoleert uw gegevens, waardoor deze wordt bewaard in elke structuur die u leuk vindt, terwijl de weergave voor presentatie en updates zorgt.

Deze zelfstudie introduceert de belangrijkste aspecten van QT’s ModelView -architectuur en gebruikt deze om eenvoudige desktop -todo -applicatie in PYQT5 te bouwen.

Modelweergave Controller

Model – Zie – Controller (MVC) is een architectonisch patroongebruik voor ontwikkelingsgebruikersinterfaces die een applicatie in drie onderling verbonden onderdelen verdelen. Dit scheidt de interne weergave van gegevens van hoe informatie wordt gepresenteerd en accepteert van de gebruiker.

Het MVC -ontwerp pattenn fets drie grote componenten –

  • Model Bevat de gegevensstructuur waarmee de app werkt.
  • Weergave is elke weergave van informatie zoals getoond aan de gebruiker, waar grafisch of tabel. Meerdere weergaven van hetzelfde datamodel zijn toegestaan.
  • Controle Accepteert invoer van de gebruiker en transformeert het in opdrachten naar voor het model of de weergave.

Het is het onderscheid tussen de uitzicht en de controller wordt een beetje troebel. QT accepteert invoergebeurtenissen van de gebruiker (via het OS) en delegeert deze aan de widgets (controller) om te hanteren. Widgets omgaan echter ook de presentatie van de huidige status aan de gebruiker, waardoor ze vierkant in de weergave plaatsen. In plaats van te kwellen over waar de lijn moet worden getrokken, zijn de weergave en controller in Qt-S-SPEAK samengevoegd met een model/viewController-architectuur-modelweergave “voor eenvoud.

Belangrijk is het onderscheid tussen de gegevens En Hoe het wordt gepresenteerd wordt bewaard.

De modelweergave

Het model fungeert als de interface tussen de gegevensopslag en de viewController. Het model bevat de gegevens (of een verwijzing ernaar) en presenteert deze gegevens via een gestandaardiseerde API die de gebruiker verbruikt en aan de gebruiker wordt gepresenteerd en presenteert. Meerdere weergaven kunnen dezelfde gegevens delen en deze op compleet verschillende manieren presenteren.

U kunt elke “Data Store” voor uw model gebruiken, bijvoorbeeld opgenomen in een standaard Python -lijst of woordenboek, of een database (via E.G. Sqlalchemy) – het is recht op jou.

De twee delen zijn in wezen verantwoordelijk voor –

  1. Thee model Slaat de gegevens op, of een verwijzing ernaar en retourneert individuele of reeksen records, en bijbehorende metadata of weergave instructies.
  2. Thee weergave Verzoekt gegevens van het model en geeft weer wat wordt geretourneerd op de widget.

Er is een diepgaande bespreking van de QT-architectuur in de documentatie.

De complete gids voor het verpakken van python GUI -toepassingen met Pyinstaller.

Python -toepassingen verpakken met Pyinstaller

[[korting.Korting_pc]]]% korting voor de volgende [korting.Duur]] [Korting.Beschrijving]] met de code [korting.coupon code]]

Koopkrachtpariteit

Ontwikkelaars in [[land]] krijgen [[korting.korting_pc]]] Uit alle boeken en cursussen met code [korting.coupon code]]

Een eenvoudige modelweergave – een TODO -lijst

Om aan te tonen hoe de ModelViews in de praktijk te gebruiken, zullen we een zeer eenvoudige implementatie van een desktop -todo -lijst samenstellen. Dit bestaat uit een QListView voor de lijst met items, een QLineEdit om nieuwe items in te voeren en een set knoppen om items toe te voegen, te verwijderen of te markeren zoals gedaan.

De gebruikersinterface

De eenvoudige gebruikersinterface was een lelijk uitje Qt -maker en opgeslagen als MainWindow.ui . Thee .UI -bestand en alle andere onderdelen kunnen hieronder worden gedownload.

Het ontwerpen van een eenvoudige TODO -app in QT -maker

Het ontwerpen van een eenvoudige TODO -app in QT -maker

De running -app wordt hieronder weergegeven.

De lopende Todo Gui (nog niets werkt)

De lopende Todo Gui (nog niets werkt)

De widgets die beschikbaar zijn in de interface die we de ID’s hebben gegeven die in de onderstaande tabel worden weergegeven.

objeuch Vriendelijk Beschrijving
Todview QlistView De lijst met huidige Todos
Tododit Qlineedit De tekstinvoer voor het maken van een nieuw TODO -item
addbutton Qpushbutton Maak de nieuwe Todo en voeg deze toe aan de TODOS -lijst
deletebutton Qpushbutton Verwijder de huidige geselecteerde TODO en verwijder deze uit de TODOS -lijst
CompleteButton Qpushbutton Markeer de stroom geselecteerde TODO zoals gedaan

We zullen deze identificatiegegevens gebruiken om de applicatie -logica later aan te sluiten.

Het model

We definiëren ons aangepaste model door te subclasseren van de implementatie, waardoor we ons kunnen concentreren op de onderdelen die uniek zijn voor ons model. QT proeft een aantal verschillende models, waaronder lijsten, bomen en tabellen (ideaal voor spreadsheets).

Voor dit voorbeeld geven we het resultaat weer aan een QListView . Het bijpassende basismodel hiervoor is QABStractListModel . De overzichtsdefinitie voor ons model wordt hieronder weergegeven.

Klasse ToDomodel (Qtcore.QabstractlistModel): def __init __ (self, *args, todos = geen, ** Kwargs): super (ToDomodel, Self).__init __ (*args, ** kwargs) zelf.Todos = Todos of [] def -gegevens (zelf, index, rol): als rol == QT.DisplayRole: # Zie hieronder voor de gegevensstructuur. status, tekst = zelf.Todos [index.ROW ()] # Retourneer alleen de TODO -tekst. Retourneer tekst Def Rowcount (zelf, index): return len (self.Todos) 

Thee .TODOS VARIABLE is onze gegevensopslag en de twee methoden RowCount () en data () zijn standaardmodelmethoden die we moeten voor een lijstmodel. We gaan hieronder op hun beurt door.

.TODOS -lijst

De gegevensopslag voor ons model is .Todos, een eenvoudige pythonlijst waarin we een tuple van waarden opslaan in het formaat [(bool, str), (bool, str), (bool, str)] waar bool het is daarom Staat van een bepaalde invoer, en STR is de tekst van de Todo.

We initialiseren zichzelf.TODO naar een lege lijst bij het opstarten, tenzij een lijst wordt doorgegeven via het TODOS -trefwoordargument.

zelf.Todos = Todos of [] zal zichzelf instellen.Todos naar de verstrekte TODOS -waarde als dat zo is truty (i.e. Iets anders dan een lege lijst, de boolean false of geen de standaardwaarde), anders wordt deze ingesteld op de lege lijst [] .

Om een ​​inzet van dit model te creëren, kunnen we eenvoudig –

Model = toMomodel () # Maak een lege TODO -lijst 

Of om in een bestaande lijst door te geven –

Todos = [(false, 'een item'), (false, 'een ander item')] model = toModel (Todos) 

.Aantal rijen ()

Thee .Rowcount () methode is Callade door de weergave om het aantal rijen in de huidige gegevens te krijgen. Dit is vereist voor de weergave naar nu de maximale index die het de gegevensopslag opnieuw kan uitvoeren (rijtelling-1). Verkoop We gebruiken een Python -lijst als onze gegevensopslag, de retourwaarde hiervoor is eenvoudig de len () van de lijst.

.Gegevens ()

Dit is de kern van uw model, dat verzoeken om gegevens uit de weergave behandelt en het juiste resultaat retourneert. Het ontvangt twee parameters -index en rol.

Index is de positie/coördinaten van de gegevens die de weergave aanvraagt, toegankelijk voor twee methoden .Rij () en .kolom () die de positie in elke dimensie geven.

Voor onze QListView is de kolom altijd 0 en kan worden genegeerd, maar u zou dit moeten gebruiken voor 2D -gegevens in een spreadsheetweergave.

Rol is een vlag die de vriendelijk van gegevens die de weergave aanvraagt. Dit komt omdat de .Data () -methode heeft eigenlijk meer verantwoordelijkheid dan alleen de kerngegevens. Het behandelt ook verzoeken om stijlinformatie, tooltips, statusbars, enz. – basaal alles wat kan worden geïnformeerd door de gegevens zelf.

De naamgeving van QT.DisplayRole is een beetje raar, maar dit geeft aan dat de weergave vraagt ​​ons “geef me alsjeblieft gegevens voor weergave”. Er zijn andere rollen Die de gegevens kunnen ontvangen voor stylingaanvragen of het aanvragen van gegevens in het formaat “Beeldklaar”.

Rol Waarde Beschrijving
QT.Weergave 0 De belangrijkste gegevens die moeten worden weergegeven in de vorm van tekst. (QString)
QT.Decoratierol 1 De gegevens die moeten worden weergegeven als een decoratie in de vorm van een pictogram. (Qcolor, Qicon of QPixMap)
QT.Redactioneel 2 De gegevens in een formele volgorde voor het bewerken in een redacteur. (QString)
QT.Tooltiprol 3 De gegevens die worden weergegeven in de tooltip van het item. (QString)
QT.Statustiprol 4 De gegevens die worden weergegeven in de statusbalk. (QString)
QT.Wat is het thisrole 5 De gegevens die voor het item worden weergegeven in “Wat is dit?” mode. (QString)
QT.Sizehintrol 13 De grootte van het item dat aan de weergaven wordt geleverd. (Qsize)

Voor een volledige lijst met beschikbare rollen Dat u de QT ITMDatarole -documentatie kunt ontvangen. Onze TODO -lijst gebruikt alleen QT.DisplayRole en QT.Decoratierol .

Basisimplementatie

Hieronder is de basisstubtoepassing die nodig is om de gebruikersinterface te laden en weer te geven. We zullen onze modelcode en applicatie -logica toevoegen aan deze basis.

SYS importeren uit PYQT5 Import Qtcore, Qtgui, Qtwidgets, UIC van Pyqt5.Qtcore import qt_creator_file = "mainWindow.ui "ui_mainwindow, qtbaseclass = uic.Loaduduype (qt_creator_file) klasse toomodel (qtcore.QabstractlistModel): def __init __ (self, *args, todos = geen, ** Kwargs): super (ToDomodel, Self).__init __ (*args, ** kwargs) zelf.Todos = Todos of [] def -gegevens (zelf, index, rol): als rol == QT.DisplayRole: status, tekst = zelf.Todos [index.Row ()] retourneer tekst def rowcount (zelf, index): return len (self.TODOS) klasse MainWindow (qtwidgets.QMainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (zelf) zelf.Setupui (zelf) zelf.Model = toomodel () self.Todview.SetModel (zelf.Model) app = qtwidgets.Qapplication (sys.Argv) venster = mainWindow () venster.Show () app.Exec_ () 

We definiëren ons toomodel zoals voorheen, en initialiseren het MainWindow -object. In de __init__ voor de MainWindow maken we een exemplaar van ons TODO -model en stellen we dit model in op de TODO_VIEW . Sla dit bestand op als TODO.Py en run het met –

python3 Todo.tempo 

Hoewel er nog niet veel te zien is, werken de QListView en ons model daadwerkelijk – als u enkele standaardgegevens toevoegt, ziet u deze in de lijst verschijnen.

zelf.Model = toModel (Todos = [(false, 'My First Todo')])))))) 

QlistView met hardgecodeerd TODO-item

QlistView met hardgecodeerd TODO-item

U kunt items zo handmatig blijven toevoegen en ze verschijnen in volgorde in de QListView . Vervolgens zullen we het mogelijk maken om ITM’s toe te voegen vanuit de toepassing.

Maak eerst een nieuwe methode op de hoofdwindow genaamd Add . Dit is onze callback die zorgt voor het toevoegen van de huidige tekst van de invoer als een nieuwe TODO. Verbind deze methode met de addButton.Geperste signaal aan het einde van het __init__ -blok.

Klasse mainWindow (qtwidgets.QMainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (zelf) zelf.Setupui (zelf) zelf.Model = toomodel () self.Todview.SetModel (zelf.Model) # Sluit de knop aan. zelf.addbutton.druk op.Verbinding maken (zelf.Toevoegen) def toevoegen (self): "" Voeg een item toe aan onze TODO -lijst en haal de tekst van de QLineEdit .Todoedit en daar opruimen. "" "text = self.Tododit.Text () als tekst: # geen lege snaren toevoegen. # Toegang tot de lijst via het model. zelf.model.Todos.Append ((false, text)) # trigger vernieuwen. zelf.model.lay -outchanged.Emit () # de invoer zelf leegmaken.Tododit.SetText ("") 

In de ADD -blokkentem op de lijn zelf.model.lay -outchanged.Emit () . Hier geven we een modelsignaal uit .lay -outchanged om het zicht te laten weten dat de vorm van de gegevens is gewijzigd. Dit leidt tot een verversing van de entiteit van het beeld. Als u deze regel weglaat, wordt de TODO nog steeds toegevoegd, maar de QListView wordt niet bijgewerkt.

Als alleen de gegevens worden gewijzigd, maar het aantal rijen/kolommen niet beïnvloedt, kunt u de .Datachanged () signaal in plaats daarvan. Dit definieert ook een gewijzigde regio in de gegevens met behulp van een huur linksboven en links-rechts verhuur om te voorkomen dat de hele weergave weergaat.

De andere acties aansluiten

We kunnen nu de rest van de signalen van de knop verbinden en hulp toevoegen voor prestaties verwijderen En compleet activiteiten. We voegen de knopsignalen toe aan het __init__ -blok zoals voorheen.

 zelf.addbutton.druk op.Verbinding maken (zelf.Toevoegen) zelf.deletebutton.druk op.Verbinding maken (zelf.Verwijderen) Zelf.CompleteButton.druk op.Verbinding maken (zelf.Compleet) 

Definieer vervolgens een nieuwe verwijderingsmethode als volgt –

 Def Delete (Self): Indexes = Self.Todview.SelectedDIndexes () If Indexes: # Indexes is een lijst van een enkel item in single-select. Index = indexen [0] # Verwijder het item en vernieuw. Zelf.model.Todos [index.Rij ()] zelf.model.lay -outchanged.Emit () # de selectie wissen (omdat deze niet lang geldig is). zelf.Todview.Clarselection () 

We gebruiken zichzelf.Todview.SelectedDIndexes om de indexen te krijgen (eigenlijk een lijst van een enkel item, zoals we in een single-selectiemodus) en vervolgens de .Row () als een index in onze lijst met Todos op ons model. We verwijderen het geïndexeerde item met behulp van de DEL -operator van Python en activeren vervolgens een lay -outchanged signaal omdat de vorm van de gegevens is gewijzigd.

Ten slotte wissen we de actieve selectie omdat het item waar het op betrekking heeft nu misschien buiten de grenzen is (als u het laatste item had geselecteerd).

U kunt proberen deze Smartter te maken en in plaats daarvan het laatste item in de lijst selecteren

De volledige methode zoals deze –

 Def compleet (self): indexes = self.Todview.selectredIndexes () if indexen: index = indexen [0] rij = index.Rij () status, text = self.model.Todos [rij] zelf.model.Todos [ROW] = (True, Text) # .Datachanged neemt linksboven en rechtsonder, die gelijk zijn # voor een enkele selectie. zelf.model.datachanged.Emit (index, index) # de selectie wissen (omdat deze niet lang geldig is). zelf.Todview.Clarselection () 

Dit gebruikt dezelfde indexering als voor verwijder, maar deze keer halen we het item uit het model .TODOS -lijst en vervang vervolgens de status door True .

We moeten dit doen ophalen en vervangen, omdat onze gegevens worden opgeslagen als python-tupels die niet kunnen worden gewijzigd.

De sleutel hier anders versus. Standaard QT -widgets is dat we onze gegevens rechtstreeks wijzigen en eenvoudigweg QT moeten op de hoogte stellen dat Haasurd verandert – het bijwerken van de widgetstatus wordt automatisch behandeld.

Qt gebruiken.Decoratierol

Als u de applicatie nu uitvoert, moet u merken dat het toevoegen en verwijderen van beide werkzaamheden, maar tijdens het voltooien van items is er geen aanwijzingen in de weergave. We moeten ons model bijwerken om de weergave een indicator te geven om weer te geven wanneer een item is voltooid. Het bijgewerkte model wordt hieronder weergegeven.

Tick ​​= qtgui.Qimage ('Tick.Png ') klasse ToDomodel (QTCore.QabstractlistModel): def __init __ (self, *args, todos = geen, ** Kwargs): super (ToDomodel, Self).__init __ (*args, ** kwargs) zelf.Todos = Todos of [] def -gegevens (zelf, index, rol): als rol == QT.DisplayRole: _, text = self.Todos [index.Rij ()] Retourneer tekst als rol == QT.DecorationRole: status, _ = self.Todos [index.ROW ()] Als status: return tick def rowcount (zelf, index): return len (self.Todos) 

Gebruikten een tekenpictogram tik.PNG om complete items aan te geven, die we laden in een Qimage -object met de naam Tick . In het model hebben we een handler voor de QT geïmplementeerd.DecorationRole die het tekenpictogram retourneert voor rijen wiens status waar is (voor compleet).

Het pictogram dat ik gebruik, is ontleend aan de fugaetes ingesteld door P.Yusukekamiyamane

Intostad van een I -pictogram kunt u ook terugkeren naar kleur, e.G. Qtgui.Qcolor (‘groen’) die zal worden getekend als vast vierkant.

Het uitvoeren van de app moet u nu als voltooid items kunnen markeren.

Todos gemarkeerd compleet

Todos gemarkeerd compleet

Een persisterende gegevensopslag

Onze TODO-app werkt goed, maar het heeft één fatale fout-het vergeet je Todos zodra je de applicatie sluit terwijl je denkt dat je niets te doen hebt als je dat doet om bij te dragen aan de korte termijn gevoelens van Zen, op lange termijn is het waarschijnlijk een slecht idee.

De oplossing is het implementeren van een uitje van persistische gegevensopslag. De eenvoudigste aanpak is een eenvoudige bestandsopslag, waarbij we items uit een JSON- of Pickle -bestand bij het opstarten laden en terugschrijven op wijzigen.

Om dit te doen definiëren we twee nieuwe methoden in onze hand . Deze laden gegevens uit een JSON -bestandsnaamgegevens.JSON (als het bestaat, negeer de fout als dit niet het geval is) voor zichzelf.model.Todos en schrijf het huidige zelf.model.Todos naar hetzelfde bestand, respectievelijk.

 Def load (self): probeer: met open ('data.json ',' r ') als f: self.model.Todos = JSON.Load (F) Uitzondering uitzondering: pass def save (self): met open ('data.JSON ',' W ') As F: Data = JSON.Dump (zelf.model.Todos, f) 

Om de wijzigingen in de gegevens te behouden die we nodig hebben om de .Save () handler op het einde van elke methode die de gegevens wijzigt, en de .Load () handler naar het __init__ -blok nadat het model heeft gemaakt.

De laatste code ziet er zo uit –

Import Sys import JSON uit Pyqt5 Import QTCore, Qtgui, Qtwidgets, UIC van Pyqt5.Qtcore import qt_creator_file = "mainWindow.ui "ui_mainwindow, qtbaseclass = uic.Loaduduseype (qt_creator_file) tick = qtgui.Qimage ('Tick.Png ') klasse ToDomodel (QTCore.QabstractlistModel): def __init __ (self, *args, todos = geen, ** Kwargs): super (ToDomodel, Self).__init __ (*args, ** kwargs) zelf.Todos = Todos of [] def -gegevens (zelf, index, rol): als rol == QT.DisplayRole: _, text = self.Todos [index.Rij ()] Retourneer tekst als rol == QT.DecorationRole: status, _ = self.Todos [index.ROW ()] Als status: return tick def rowcount (zelf, index): return len (self.TODOS) klasse MainWindow (qtwidgets.QMainwindow, ui_mainwindow): def __init __ (self): super (mainwindow, self).__Init __ () self.Setupui (zelf) zelf.Model = toomodel () self.Lading () zelf.Todview.SetModel (zelf.Model) zelf.addbutton.druk op.Verbinding maken (zelf.Toevoegen) zelf.deletebutton.druk op.Verbinding maken (zelf.Verwijderen) Zelf.CompleteButton.druk op.Verbinding maken (zelf.Voltooid) def Toevoegen (self): "" "Voeg een item toe aan onze TODO -lijst en haal de tekst van de QLineEdit .Todoedit en daar opruimen. "" "text = self.Tododit.Text () als tekst: # geen lege snaren toevoegen. # Toegang tot de lijst via het model. zelf.model.Todos.Append ((false, text)) # trigger vernieuwen. zelf.model.lay -outchanged.Emit () # de invoer zelf leegmaken.Tododit.SetText ("") zelf.Save () def delete (self): indexes = self.Todview.SelectedDIndexes () If Indexes: # Indexes is een lijst van een enkel item in single-select. Index = indexen [0] # Verwijder het item en vernieuw. Zelf.model.Todos [index.Rij ()] zelf.model.lay -outchanged.Emit () # de selectie wissen (omdat deze niet lang geldig is). zelf.Todview.Clarselection () zelf.Save () def compleet (self): indexes = self.Todview.selectredIndexes () if indexen: index = indexen [0] rij = index.Rij () status, text = self.model.Todos [rij] zelf.model.Todos [ROW] = (True, Text) # .Datachanged neemt linksboven en rechtsonder, die gelijk zijn # voor een enkele selectie. zelf.model.datachanged.Emit (index, index) # de selectie wissen (omdat deze niet lang geldig is). zelf.Todview.Clarselection () zelf.Opslaan () def load (self): probeer: met open ('data.db ',' r ') als f: self.model.Todos = JSON.Load (F) Uitzondering uitzondering: pass def save (self): met open ('data.db ',' w ') als f: data = json.Dump (zelf.model.Todos, f) app = qtwidgets.Qapplication (sys.Argv) venster = mainWindow () venster.Show () app.Exec_ () 

Als de gegevens in uw applicatie het potentieel hebben om groot of complexer te worden, kunt u vooraf een daadwerkelijke database gebruiken om deze op te slaan. In dit geval zal het model de interface in de database verplaatsen en deze rechtstreeks opvragen voor gegevens om weer te geven. De l’ll cover hoe dit te doen in een komende tutorial.

Zie dit voorbeeld Media Player -applicatie voor een ander interessant voorbeeld van een QListView. Het gebruikt het QT -gebouw QMediAplayList als de datastore, met het inhoudsbeeld naar een QListView .

Over BCR.CX:

BCR.CX is een Braziliaanse technologie -startup, gespecialiseerd in zowel Business Outsourcing Processs (BPO) als Business Environment Outsourcing (BEO), voornamelijk gericht op het genereren van vraag, klantervaring, communicatie, gebruikersondersteuning en tevredenheid.

Beschrijving:

De TODO-app is ontwikkeld als een snelle, veilige en gebruiksvriendelijke manier om de notities van de agent tijdens de werkdagen op te slaan.

In staat zijn om uw eigen taken te maken en te beheren, op basis van elk individueel ticket of klant.

Maak paden en pas uw workflow aan

Productiviteit verbeteren! TODO -app gebruiken U kunt aangepaste workflows maken om herhaalde processen te standaardiseren. Probeer het nu en begin met het beheersen van uw voortgang, zoals uw Todos en Dones.

Bronnen:

  1. Maak taken voor elk ticket
  2. Progress Bar om te leveren levering
  3. Creëer gestandaardiseerde workflows om de productiviteit te verbeteren.
  4. Beheer uw takenlijst, om het bij te houden met uw dagelijkse routine.
  1. Stapel zowel Todo als Zendesk Sunshine om volledige toegang te verkrijgen via de app -functies
  2. De productiviteit verbeteren door automatisering van taken te maken of te bewerken en uw gepersonaliseerde presets op te slaan.