TODO sull’App Store Mac, utilizzando l’architettura ModelView PYQT5 per creare una semplice app Todo
L’architettura ModelView QT S MVC simile a MVC per la visualizzazione dei dati nelle viste
Contents
- 1 L’architettura ModelView QT S MVC simile a MVC per la visualizzazione dei dati nelle viste
- 1.1 Todo 4+
- 1.2 App Privacy
- 1.3 L’architettura ModelView Interfaccia simile a MVC di QT per la visualizzazione dei dati nelle viste
- 1.4 Controller di visualizzazione modello
- 1.5 La vista del modello
- 1.6 Una semplice vista modello: un elenco di todo
- 1.7 Un archivio dati persistono
- 1.8 A proposito di BCR.CX:
- 1.9 Descrizione:
- 1.10 Risorse:
L’app in esecuzione è mostrata di seguito.
Todo 4+
Per diversi anni ho usato questa applicazione sul mio iPad, il mio iPhone e il mio MacBookPro. Se continua a funzionare perfettamente su iOS, sembra che non abbia seguito completamente l’evoluzione di MacOS.
Nessun problema di installarlo. Ma non è più possibile sincronizzare con Toodledo su macOS, mentre continua ad essere possibile su iOS: gli stessi identificatori non sono riconosciuti.
Diventa quindi inutile per me … e l’assistenza di Appigo non sembra avere fretta di fornire una risposta alla mia richiesta. È sempre spiacevole notare che il concetto di cliente perde un po ‘più del suo valore ogni giorno.
Pisa d
Da questo aggiornamento ho perso tutte le mie liste nel numero di 12 e con cui lavoro quotidianamente in modo professionale. Gestisco permanentemente circa 200 punti, questo aggiornamento ha messo a terra mesi di calvario ! Tutti i compiti organizzati nell’elenco si sono trovati raggruppati in un unico elenco globale. Non è certamente questo bug che mi farà passare alla versione dicendo professionista di questo software altrimenti eccellente. Non sarò mai prigioniero. Rimane solo per me aspettare la risposta del supporto contattato questa sera via e -mail o poi trovare la vecchia versione di questo magnifico software. Spero davvero che si tratti di un Beginful Beug della nuova versione e non di una strategia per costringere a migrare verso la versione Pro Pago Pro per trovare funzionalità già acquisite con la versione precedente. Per informazioni la mia sincronizzazione è fatta con Dropbox
SurlePoint, 13/12/2011
La sincronizzazione è ora nichel
Ho afferrato prima della sincronizzazione che era lenta, camminava male, ecc. Ma ora con iCloud, mi si adatta perfettamente.
Alcuni possibili miglioramenti: più impostazioni di visualizzazione.
– per visualizzare solo ciò che l’utente utilizza. Ad esempio, non uso contesti o etichette (in ogni caso non ancora) e vorrei non visualizzare più queste opzioni che “inquinano” il mio todo. Vorrei avere solo “data / priorità / elenco / tipo” per le mie note quotidiane e il clic destro per le opzioni che raramente uso
– E al contrario vorrei un semplice display PLSU rispetto a un menu a discesa per scegliere la data, la priorità, l’elenco, … Se ho solo tre elenchi, allora tre pulsanti sarebbero sufficienti per essere visualizzati e potrei scegliere la mia lista Con un clic invece di fare clic sul menu Drop -Down, trova il nome e fai clic su di esso. (Idem per priorità, in particolare che passiamo da un disegno molto visivo nell’elenco Todo a una scelta di nome nelle opzioni che non è molto naturale.
Questi sono dettagli ergonomici. Mi piace la semplicità e l’efficienza di Todo, quindi vorrei che possa essere ancora più configurabile essere ancora più semplice.
App Privacy
Lo sviluppatore, Appigo, non ha fornito dettagli sulle sue pratiche private e sulla gestione dei dati ad Apple. Per ulteriori informazioni, consultare la politica sulla privacy dello sviluppo.
L’architettura ModelView
Interfaccia simile a MVC di QT per la visualizzazione dei dati nelle viste
Quando inizi a creare applicazioni più complesse con PYQT5, probabilmente ti imbatterai nel mantenimento dei widget sincronizzati con i tuoi dati. Dati archiviati in widget (e.G. Un semplice QlistWidget) non è prontamente disponibile per manipolare da Python: le modifiche richiedono di ottenere un elemento, ottenere i dati e quindi impostarli indietro. La soluzione predefinita a ciò è quella di mantenere una rappresentazione di dati esterna in Python, e quindi e -eth duplicare gli aggiornamenti ai dati e al widget o semplicemente riscrivere il widget Wihole dai dati. Questo può diventare brutto rapidamente e si traduce in molta piastra solo per armeggiare i dati.
Per fortuna Qt ha una soluzione per questo – ModelViews. Le visualizzazioni dei modelli sono una potente alternativa ai widget di visualizzazione standard, che utilizzano un’interfaccia modello normale per interagire con le origini dati – dalle semplici strutture di dati a database esterni. Ciò isola i tuoi dati, consentendo che siano mantenuti in qualsiasi struttura che desideri, mentre la vista si occupa della presentazione e degli aggiornamenti.
Questo tutorial introduce gli aspetti chiave dell’architettura ModelView di QT e la utilizza per creare una semplice applicazione Desktop Todo in PYQT5.
Controller di visualizzazione modello
Modello – See – Controller (MVC) è un modello di architettura per le interfacce utente di sviluppo che divide un’applicazione in tre parti interconnesse. Ciò separa la rappresentazione interna dei dati da come le informazioni vengono presentate e accettano dall’utente.
Il design MVC Pattenn Fets tre componenti principali –
- Modello Contiene la struttura dei dati con cui l’app sta lavorando.
- Visualizzazione è una rappresentazione delle informazioni come mostrato all’utente, in cui grafica o tabella. Sono consentite più viste dello stesso modello di dati.
- Controllo Accetta l’input dall’utente, trasformandolo in comandi per il modello o la vista.
Qt atterra la distinzione tra la vista e il controller diventa un po ‘oscuro. QT accetta eventi di input dall’utente (tramite il sistema operativo) e li delega ai widget (controller) per gestire. Tuttavia, i widget gestiscono anche la presentazione dello stato corrente all’utente, mettendoli esattamente nella vista. Invece di agonizzare su dove tracciare la linea, in Qt-S-speak la vista e il controller sono ilead unita a bogd a bordo.
Importante sottolineare, la distinzione tra il dati E Come viene presentato è preservato.
La vista del modello
Il modello funge da interfaccia tra l’archivio dati e ViewController. Il modello contiene i dati (o un riferimento ad esso) e presenta questi dati tramite un’API standardizzata che le viste quindi consumano e presentano all’utente. Visualizzazioni multiple possono condividere gli stessi dati, presentandoli in modi completamente diversi.
È possibile utilizzare qualsiasi “archivio di dati” per il tuo modello, incluso ad esempio un elenco o un dizionario Python standard o un database (tramite E.G. Sqlalchemy) – È a titolo di cose.
Le due parti sono essenzialmente responsabili di –
- Tè modello Memorizza i dati o un riferimento ad esso e restituisce individuali o gamme di record e metadati associati o Schermo Istruzioni.
- Tè visualizzazione Richiede i dati dal modello e visualizza ciò che viene restituito sul widget.
C’è una discussione approfondita dell’architettura QT nella documentazione.
La guida completa alla confezione di applicazioni Python GUI con Pyinstaller.
[[sconto.Sconto_pc]]]% di sconto per il prossimo [sconto.durata]] [sconto.Descrizione]] con il codice [sconto.codice coupon]]
Parità del potere di acquisto
Gli sviluppatori in [[paese]] ottengono [[sconto.sconto_pc]] OFF su tutti i libri e corsi con codice [sconto.codice coupon]]
Una semplice vista modello: un elenco di todo
Per dimostrare come utilizzare le visualizzazioni dei modelli in pratica, metteremo insieme un’implementazione molto semplice di un elenco di Desktop Todo. Questo consisterà in una QListView per l’elenco degli elementi, un QlineEdit per inserire nuovi elementi e una serie di pulsanti da aggiungere, eliminare o contrassegnare gli elementi come fatti.
L’interfaccia utente
L’interfaccia utente semplice era brutta creatore QT e salvato come Mainwindow.UI . Tè .il file dell’interfaccia utente e tutte le altre parti possono essere scaricate di seguito.
Progettare una semplice app Todo in QT Creator
L’app in esecuzione è mostrata di seguito.
The Running Todo Gui (Niente funziona ancora)
I widget disponibili nell’interfaccia abbiamo fornito gli ID mostrati nella tabella seguente.
objeuch | Tipo | Descrizione |
---|---|---|
todview | QListview | L’elenco degli attuali todos |
Tododit | Qlineedit | L’input di testo per la creazione di un nuovo elemento Todo |
addButton | Qpushbutton | Crea il nuovo Todo, aggiungendolo all’elenco TODOS |
ELETEBUTTON | Qpushbutton | Elimina l’attuale Todo selezionato, rimuovendolo dall’elenco TODOS |
CompleteButton | Qpushbutton | Segna l’attuale todo selezionato come fatto |
Useremo questi identificatori per collegare la logica dell’applicazione in seguito.
Il modello
Definiamo il nostro modello personalizzato sottoclasse dall’implementazione, permettendoci di concentrarci sulle parti uniche del nostro modello. QT provoca una serie di basi di modello diverse, tra cui elenchi, alberi e tabelle (ideali per i fogli di calcolo).
Per questo esempio stiamo visualizzando il risultato a un QListView . Il modello di base corrispondente per questo è QabStractListModel . La definizione di schema per il nostro modello è mostrata di seguito.
Classe Todomodel (Qtcore.QabstractListModel): def __init __ (self, *args, todos = nessuno, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos o [] def data (self, indice, ruolo): se ruolo == qt.DisplayRole: # Vedi sotto per la struttura dei dati. status, text = self.Todos [indice.Riga ()] # restituisci solo il testo todo. Testo di restituzione def RowCount (self, indice): return len (self.todos)
Tè .La variabile TODOS è il nostro archivio dati e i due metodi RowCount () e Data () sono metodi del modello standard che dobbiamo per un modello di elenco. Passeremo a turno di seguito.
.Elenco todos
L’archivio di dati per il nostro modello è .TODOS, un semplice elenco di Python in cui memorizzeremo una tupla di valori nel formato [(bool, str), (bool, str), (bool, str)] dove bool è il Perciò stato di una determinata voce, e STR è il testo del Todo.
Inizializziamo il sé.Todo in un elenco vuoto all’avvio, a meno che un elenco non venga trasmesso tramite l’argomento della parola chiave di Todos.
se stesso.todos = todos o [] imposterà sé.todos al valore di todos fornito se lo è Truty (io.e. Qualunque cosa diversa da un elenco vuoto, il falso booleano o nessuno il valore predefinito), altrimenti verrà impostato nell’elenco vuoto [] .
Per creare una insanzione di questo modello possiamo semplice –
Model = todomodel () # Crea un elenco TODO vuoto
O per passare in un elenco esistente –
todos = [(false, "un elemento"), (false, "un altro elemento")] modello = todomodel (todos)
.RowCount ()
Tè .Il metodo RowCount () è Callade dalla vista per ottenere il numero di righe nei dati correnti. Questo è richiesto per la vista fino ad ora l’indice massimo che può rifare l’archivio dati (conteggio delle righe-1). Vendita Usiamo un elenco di Python come nostro archivio dati, il valore di ritorno per questo è semplicemente il len () dell’elenco.
.Dati ()
Questo è il nucleo del modello, che gestisce le richieste di dati dalla vista e restituisce il risultato appropriato. Riceve due parametri indice e ruolo.
L’indice è la posizione/coordinate dei dati richiesti dalla vista, accessibile con due metodi .Riga () e .colonna () che danno la posizione in ogni dimensione.
Per la nostra QListView la colonna è sempre 0 e può essere ignorata, ma dovresti usarlo per i dati 2D in una vista di calcolo.
Il ruolo è una bandiera che indica il Tipo di dati richiesto dalla vista. Questo perché il .Il metodo Data () ha effettivamente più responsabilità dei semplici dati. Gestisce inoltre le richieste di informazioni di stile, punte di utensili, barre di stato, ecc. – basilare tutto ciò che potrebbe essere informato dai dati stessi.
La denominazione di Qt.DisplayRole è un po ‘strano, ma questo indica che il visualizzazione ci chiede “per favore dammi i dati per la visualizzazione”. Ci sono altri ruoli Che i dati possono ricevere per le richieste di styling o per richiedere i dati in formato “Modifica pronto”.
Ruolo | Valore | Descrizione |
---|---|---|
Qt.Schermo | 0 | I dati chiave da rendere sotto forma di testo. (Qstring) |
Qt.Decorazione | 1 | I dati da rendere come una decorazione sotto forma di un’icona. (QCOLOR, QICON o QPIXMAP) |
Qt.Editoriale | 2 | I dati in un follow formale per la modifica in un editor. (Qstring) |
Qt.ToolTiprole | 3 | I dati visualizzati nell’ottimo dell’articolo. (Qstring) |
Qt.StatusProle | 4 | I dati visualizzati nella barra di stato. (Qstring) |
Qt.Whatsthisrole | 5 | I dati visualizzati per l’elemento in “Cos’è questo?” moda. (Qstring) |
Qt.Sizehintrole | 13 | Il suggerimento di dimensioni per l’articolo che verrà fornito alle viste. (QSIZE) |
Per un elenco completo di disponibile ruoli che puoi ricevere vedi la documentazione Qt Itmdatarole. La nostra lista Todo userà solo QT.DisplayRole e Qt.Decorazione .
Implementazione di base
Di seguito è riportata l’applicazione dello stub di base necessaria per caricare l’interfaccia utente e visualizzarla. Aggiungeremo il nostro codice modello e la logica dell’applicazione a questa base.
Importa sys da pyqt5 import qtcore, qtgui, qtwidgets, uic da pyqt5.Qtcore import qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = uic.CHARODUDUYPE (QT_CREATOR_FILE) CLASSE TODOMODEL (QTCORE.QabstractListModel): def __init __ (self, *args, todos = nessuno, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos o [] def data (self, indice, ruolo): se ruolo == qt.DisplayRole: Status, text = self.Todos [indice.Riga ()] return text def rowcount (self, indice): return len (self.TODOS) Classe Mainwindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (self) self.Setupui (self) self.Modello = todomodel () self.todview.SetModel (Self.Modello) app = qtwidgets.Qapplicazione (sys.Argv) finestra = mainwindow () finestra.Show () App.Exec_ ()
Definiamo il nostro todomodel come prima e inizializziamo l’oggetto MainWindow. In __init__ per il mainwindow creiamo un’istanza del nostro modello todo e impostiamo questo modello su todo_view . Salva questo file come todo.Py e eseguilo con –
Python3 todo.ritmo
Sebbene non ci sia ancora molto da vedere, QListView e il nostro modello funzionano effettivamente – se aggiungi alcuni dati predefiniti che vedrai apparire nell’elenco.
se stesso.modello = todomodel (todos = [(false, 'il mio primo todo')))))
QListview che mostra l’oggetto todo codificato
Puoi continuare ad aggiungere oggetti manualmente in questo modo e verranno visualizzati in ordine nel QListView . Successivamente consentiremo di aggiungere ITMS dall’interno dell’applicazione.
Crea innanzitutto un nuovo metodo sul mainwindow chiamato ADD . Questo è il nostro callback che si occuperà di aggiungere il testo corrente dall’input come nuovo Todo. Collega questo metodo al addButton.Segnale premuto alla fine del blocco __init__.
Classe Mainwindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (self) self.Setupui (self) self.Modello = todomodel () self.todview.SetModel (Self.Modello) # Collega il pulsante. se stesso.addButton.premere.Connetti (Self.Aggiungi) def aggiungi (self): "" Aggiungi un elemento al nostro elenco TODO, ottenendo il testo dal QlineEdit .Todoedit e lì cancellarlo. "" "text = self.Tododit.Testo () se testo: # non aggiungere stringhe vuote. # Accedi all'elenco tramite il modello. se stesso.modello.todos.Append ((false, text)) # trigger aggiorna. se stesso.modello.layoutchange.Emit () # svuota il sé input.Tododit.SetText ("")
Nel blocco aggiungi notare il sé della linea.modello.layoutchange.Emit () . Qui emettiamo un segnale modello .layoutchanged per far sapere alla vista che il forma dei dati sono stati modificati. Ciò innesca un aggiornamento dell’entità della vista. Se ometti questa riga, il todo verrà comunque aggiunto ma QListView non aggiornerà.
Se solo i dati vengono modificati, ma il numero di righe/colonne non è influenzato, è possibile utilizzare il .Segnale DataChanged () invece. Ciò definisce anche una regione alterata nei dati utilizzando un noleggio in alto a sinistra e in basso a destra per evitare di ridisegnare l’intera vista vista.
Collegare le altre azioni
Ora possiamo collegare il resto dei segnali del pulsante e aggiungere aiuto per le prestazioni eliminare E completare operazioni. Aggiungiamo i segnali del pulsante al blocco __init__ come prima.
se stesso.addButton.premere.Connetti (Self.Aggiungi) Self.ELETEBUTTON.premere.Connetti (Self.Elimina) Self.CompleteButton.premere.Connetti (Self.Completare)
Quindi definire un nuovo metodo Elimina come segue –
Def elimina (self): indici = self.todview.SelectedDindexes () Se indici: # indici è un elenco di un singolo elemento in single-select. Indice = indici [0] # Rimuovi l'elemento e aggiorna. Del Self.modello.Todos [indice.Riga ()] self.modello.layoutchange.Emit () # cancella la selezione (in quanto non è a lungo valido). se stesso.todview.ClaRsection ()
Usiamo se stessi.todview.SelectedDindexes per ottenere gli indici (in realtà un elenco di un singolo elemento, come in modalità singola selezione) e quindi il .Riga () come indice nel nostro elenco di todos sul nostro modello. Eliminiamo l’elemento indicizzato utilizzando l’operatore Del di Python, quindi attiviamo un segnale di layoutchanged perché la forma dei dati è stata modificata.
Finally, cancelliamo la selezione attiva poiché l’elemento a cui si riferisce ora potrebbe essere fuori dai limiti (se hai selezionato l’ultimo elemento).
Potresti provare a rendere questo intelligente e selezionare invece l’ultimo elemento nell’elenco
Il metodo completo piace così –
Def completo (self): indici = self.todview.SelectrEdIndexes () se indici: indice = indici [0] row = indice.Riga () status, text = self.modello.Todos [riga] sé.modello.Todos [row] = (true, text) # .Datachanged prende in alto e in basso a destra, che sono uguali # per una singola selezione. se stesso.modello.Datachanged.Emit (indice, indice) # cancella la selezione (in quanto non è valida a lungo). se stesso.todview.ClaRsection ()
Questo utilizza la stessa indicizzazione di Elimina, ma questa volta prendiamo l’articolo dal modello .elenco di todos e quindi sostituire lo stato con vero .
Dobbiamo fare questo recupero e rimborso, poiché i nostri dati sono archiviati come tuple Python che non possono essere modificate.
La chiave diversa qui vs. I widget QT standard sono che apportiamo modifiche direttamente ai nostri dati e dobbiamo consentire a Qt che cambia Haasurd – L’aggiornamento dello stato del widget viene gestita automaticamente.
Usando Qt.Decorazione
Se esegui l’applicazione ora dovresti scoprire che l’aggiunta e l’eliminazione di entrambi i lavori, ma durante il completamento degli articoli funzionano, non vi è alcuna indicazione nella vista. Dobbiamo aggiornare il nostro modello per fornire la vista con un indicatore da visualizzare quando un articolo è completo. Il modello aggiornato è mostrato di seguito.
Tick = Qtgui.QIMAGE ('Tick.png ') classe todomodel (qtcore.QabstractListModel): def __init __ (self, *args, todos = nessuno, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos o [] def data (self, indice, ruolo): se ruolo == qt.DisplayRole: _, text = self.Todos [indice.Row ()] restituisce testo se ruolo == qt.Decorationrole: status, _ = self.Todos [indice.Riga ()] se status: return tick def rowcount (self, indice): return len (self.todos)
Stavano usando un’icona zecca.Png per indicare elementi completi, che cariciamo in un oggetto QIMAGE chiamato Tick . Nel modello abbiamo implementato un gestore per il QT.Decorationrole che restituisce l’icona del segno di spunta per le righe che è vero (per il completo).
L’icona che sto usando è presa dalla fuga impostata da P.Yusukekamiyamane
Intostad di un’icona I puoi anche tornare al colore, E.G. Qtgui.QCOLOR (‘Green’) che verrà disegnato come Solid Square.
Esecuzione dell’app ora dovresti essere in grado di contrassegnare gli articoli come completi.
Todos contrassegnati completi
Un archivio dati persistono
La nostra app Todo funziona bene, ma ha un difetto fatale, dimentica i tuoi todos non appena chiudi l’applicazione mentre pensi di non avere nulla da fare quando fai maggio per contribuire ai sentimenti a breve termine di Zen, probabilmente è un cattiva idea.
La soluzione è quella di implementare una gita di persistenza di dati. L’approccio più semplice è un semplice negozio di file, in cui carichiamo gli elementi da un file JSON o sottaceto all’avvio e riscriviamo sulla modifica.
Per fare ciò definiamo due nuovi metodi sulla nostra mano . Questi dati di caricamento da un nome di nome JSON File.JSON (se esiste, ignorando l’errore se non lo fa).modello.Todos e scrivi il sé attuale.modello.Todos Out allo stesso file, rispettivamente.
DEF load (self): prova: con open ('dati.json ',' r ') come f: self.modello.Todos = json.Load (f) Eccezione: pass def salva (self): con open ('dati.json ',' w ') come f: data = json.Dump (Self.modello.todos, f)
Per persistere le modifiche ai dati di cui abbiamo bisogno per aggiungere il .Salve () gestore alla fine di qualsiasi metodo che modifica i dati e il .Carico () gestore al blocco __init__ dopo la creazione del modello.
Il codice finale sembra questo –
Import sys import json da pyqt5 import qtcore, qtgui, qtwidgets, uic da pyqt5.Qtcore import qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = uic.LoadUdUeuseype (qt_creator_file) tick = qtgui.QIMAGE ('Tick.png ') classe todomodel (qtcore.QabstractListModel): def __init __ (self, *args, todos = nessuno, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos o [] def data (self, indice, ruolo): se ruolo == qt.DisplayRole: _, text = self.Todos [indice.Row ()] restituisce testo se ruolo == qt.Decorationrole: status, _ = self.Todos [indice.Riga ()] se status: return tick def rowcount (self, indice): return len (self.TODOS) Classe Mainwindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): super (mainwindow, self).__In se stesso.Setupui (self) self.Modello = todomodel () self.Load () self.todview.SetModel (Self.Modello) Self.addButton.premere.Connetti (Self.Aggiungi) Self.ELETEBUTTON.premere.Connetti (Self.Elimina) Self.CompleteButton.premere.Connetti (Self.Completo) def aggiungi (self): "" "Aggiungi un elemento al nostro elenco Todo, ottenendo il testo da QlineEdit .Todoedit e lì cancellarlo. "" "text = self.Tododit.Testo () se testo: # non aggiungere stringhe vuote. # Accedi all'elenco tramite il modello. se stesso.modello.todos.Append ((false, text)) # trigger aggiorna. se stesso.modello.layoutchange.Emit () # svuota il sé input.Tododit.SetText ("") Self.Salva () def elimina (self): indice = self.todview.SelectedDindexes () Se indici: # indici è un elenco di un singolo elemento in single-select. Indice = indici [0] # Rimuovi l'elemento e aggiorna. Del Self.modello.Todos [indice.Riga ()] self.modello.layoutchange.Emit () # cancella la selezione (in quanto non è a lungo valido). se stesso.todview.ClaRsection () Self.Salva () def complet (self): indici = self.todview.SelectrEdIndexes () se indici: indice = indici [0] row = indice.Riga () status, text = self.modello.Todos [riga] sé.modello.Todos [row] = (true, text) # .Datachanged prende in alto e in basso a destra, che sono uguali # per una singola selezione. se stesso.modello.Datachanged.Emit (indice, indice) # cancella la selezione (in quanto non è valida a lungo). se stesso.todview.ClaRsection () Self.Salva () def load (self): prova: con open ('dati.db ',' r ') come f: self.modello.Todos = json.Load (f) Eccezione: pass def salva (self): con open ('dati.db ',' w ') come f: data = json.Dump (Self.modello.todos, f) app = qtwidgets.Qapplicazione (sys.Argv) finestra = mainwindow () finestra.Show () App.Exec_ ()
Se i dati nell’applicazione hanno il potenziale per diventare grandi o più complessi, è possibile preparare un database effettivo per archiviarlo. In questo caso il modello avvolgerà l’interfaccia nel database e la interrogherà direttamente per i dati da visualizzare. La copertina dell’LL come farlo in un tutorial imminente.
Per un altro interessante esempio di QListView, consultare questo esempio di applicazione per lettore multimediale. Utilizza la costruzione QT QmeDiAplayList come DataStore, con il contenuto visualizzato a QListView .
A proposito di BCR.CX:
Bcr.CX è una startup tecnologica brasiliana, specializzata sia nei processi di outsourcing aziendale (BPO) che in Business Environment Outsourcing (BEO), incentrato principalmente sulla generazione della domanda, l’esperienza del cliente, la comunicazione, il supporto degli utenti e la soddisfazione.
Descrizione:
L’app Todo è stata sviluppata come un modo rapido, sicuro e intuitivo per archiviare le note dell’agente durante i giorni lavorativi.
Essere in grado di creare e gestire le tue attività, in base a ogni singolo biglietto o cliente.
Crea sentieri e personalizza il tuo flusso di lavoro
Miglioramento della produttività! Utilizzo dell’app Todo è possibile creare flussi di lavoro personalizzati per standardizzare i processi ripetitivi. Prova ora e inizia a controllare i tuoi progressi, mentre i tuoi todos e dona.
Risorse:
- Crea compiti per ogni biglietto
- Barra di avanzamento da seguire consegnabile
- Crea flussi di lavoro standardizzati per migliorare la produttività.
- Gestisci il tuo elenco di attività, al fine di tenerlo al passo con la tua routine quotidiana.
- Impila sia Todo che Zendesk Sunshine per ottenere il pieno accesso rispetto alle funzionalità dell’app
- Migliora la produttività creando o modificando le attività di attività e salva i preset personalizzati.