ToDo στο Mac App Store, χρησιμοποιώντας την αρχιτεκτονική PYQT5 ModelView για να δημιουργήσετε μια απλή εφαρμογή Todo

Η αρχιτεκτονική ModelView QT S MVC-Like Interface για την εμφάνιση δεδομένων στις προβολές

Η εφαρμογή τρέχουσα εμφανίζεται παρακάτω.

TODO 4+

Για αρκετά χρόνια χρησιμοποίησα αυτήν την εφαρμογή στο iPad μου, το iPhone μου και το MacBookPro μου. Εάν συνεχίσει να λειτουργεί τέλεια στο iOS, φαίνεται ότι δεν έχει ακολουθήσει πλήρως την εξέλιξη του macOS.
Δεν υπάρχουν προβλήματα εγκατάστασης. Αλλά δεν είναι πλέον δυνατό να συγχρονιστεί με το Toodledo στο MacOS, ενώ εξακολουθεί να είναι δυνατή στο iOS: τα ίδια αναγνωριστικά δεν αναγνωρίζονται.
Επομένως, γίνεται περιττό για μένα … και η βοήθεια του Appigo δεν φαίνεται να βιάζεται να δώσει μια απάντηση στο αίτημά μου. Είναι πάντα δυσάρεστο να σημειωθεί ότι η έννοια του πελάτη χάνει λίγο περισσότερο την αξία του κάθε μέρα.

PISA D

Δεδομένου ότι αυτή η ενημέρωση έχω χάσει όλες τις λίστες μου στον αριθμό των 12 και με τον οποίο εργάζομαι καθημερινά με επαγγελματικό τρόπο. Διαχειρίζομαι περίπου 200 σημεία μόνιμα, αυτή η ενημέρωση έχει βάλει στους μήνες της δοκιμασίας ! Όλες οι εργασίες που οργανώθηκαν στη λίστα βρέθηκαν ομαδοποιημένα σε έναν ενιαίο παγκόσμιο κατάλογο. Σίγουρα δεν είναι αυτό το σφάλμα που θα με κάνει να περάσω στην έκδοση λέγοντας επαγγελματία αυτού του λογισμικού. Δεν θα είμαι ποτέ αιχμάλωτος. Παραμένει μόνο για μένα να περιμένω την απάντηση της υποστήριξης που ήρθα σε επαφή με το απόγευμα μέσω ηλεκτρονικού ταχυδρομείου ή, στη συνέχεια, να βρω την παλιά έκδοση αυτού του υπέροχου λογισμικού. Ελπίζω πραγματικά ότι είναι ένας νεανικός beug της νέας έκδοσης και όχι μια στρατηγική για να αναγκαστεί να μεταναστεύσει στην πληρωμένη έκδοση Pro για να βρει λειτουργικές λειτουργίες που έχουν ήδη αποκτηθεί με την προηγούμενη έκδοση. Για πληροφορίες ο συγχρονισμός μου γίνεται με το Dropbox

Surlepoint, 12/13/2011

Το Synchro είναι τώρα νικέλιο

Πήρα πριν από τον συγχρονισμό που ήταν αργός, περπάτησε άσχημα, κλπ. Αλλά τώρα με το iCloud, μου ταιριάζει τέλεια.

Μερικές πιθανές βελτιώσεις: περισσότερες ρυθμίσεις εμφάνισης.
– για να εμφανίσει μόνο αυτό που χρησιμοποιεί ο χρήστης. Για παράδειγμα, δεν χρησιμοποιώ πλαίσια ή ετικέτες (σε καμία περίπτωση δεν είναι ακόμα) και θα ήθελα να μην εμφανίζω πλέον αυτές τις επιλογές που “μολύνουν” το todo μου. Θα ήθελα να έχω μόνο “ημερομηνία / προτεραιότητα / λίστα / τύπος” για τις καθημερινές μου σημειώσεις και κάντε δεξί κλικ για τις επιλογές που σπάνια χρησιμοποιώ
– Και αντιστρόφως θα ήθελα μια απλή οθόνη PLSU από ένα μενού μενού για να επιλέξει την ημερομηνία, την προτεραιότητα, τη λίστα, … αν έχω μόνο τρεις λίστες, τότε τρία κουμπιά θα ήταν αρκετά για να εμφανιστούν και θα μπορούσα να επιλέξω τη λίστα μου Με ένα κλικ αντί να κάνετε κλικ στο μενού drop -down, βρείτε το όνομα και κάντε κλικ σε αυτό. (Ditto για προτεραιότητα, ειδικά ότι πηγαίνουμε από ένα πολύ οπτικό σχέδιο στη λίστα Todo σε μια επιλογή ονόματος στις επιλογές που δεν είναι πολύ φυσικές.

Αυτά είναι λεπτομέρειες εργονομίας. Μου αρέσει η απλότητα και η αποτελεσματικότητα του ToDo, οπότε θα ήθελα να είναι ακόμα πιο διαμορφωμένο για να είναι ακόμη πιο απλό.

App ιδιωτική ζωή

Ο προγραμματιστής, Appigo, δεν έχει παράσχει λεπτομέρειες σχετικά με τις ιδιωτικές πρακτικές και το χειρισμό των δεδομένων στην Apple. Για περισσότερες πληροφορίες, ανατρέξτε στην πολιτική απορρήτου της ανάπτυξης.

Η αρχιτεκτονική ModelView
Η διεπαφή τύπου MVC της QT για την εμφάνιση δεδομένων στις προβολές

Καθώς αρχίζετε να δημιουργείτε πιο πολύπλοκες εφαρμογές με το PYQT5, πιθανότατα θα συναντήσετε τη διατήρηση των γραφικών σε συγχρονισμό με τα δεδομένα σας. Δεδομένα που είναι αποθηκευμένα σε widgets (e.σολ. Ένα απλό Qlistwidget) δεν είναι άμεσα διαθέσιμο για να χειριστεί από την Python – οι αλλαγές απαιτούν να πάρετε ένα στοιχείο, να λάβετε τα δεδομένα και στη συνέχεια να το επαναφέρετε. Η προεπιλεγμένη λύση σε αυτό είναι να διατηρηθεί μια εξωτερική αναπαράσταση δεδομένων στην Python, και στη συνέχεια Eith διπλασιάζουν ενημερώσεις τόσο για τα δεδομένα όσο και για το widget, ή απλά ξαναγράψτε το wihole widget από τα δεδομένα. Αυτό μπορεί να γίνει άσχημο γρήγορα και έχει ως αποτέλεσμα πολλά boilerplate μόνο για να φτιάξετε τα δεδομένα.

Ευτυχώς το QT έχει μια λύση για αυτό – ModelViews. Το ModelViews είναι μια ισχυρή εναλλακτική λύση στα τυπικά γραφικά στοιχεία οθόνης, τα οποία χρησιμοποιούν μια τακτική διεπαφή μοντέλου για να αλληλεπιδρούν με πηγές δεδομένων – από απλές δομές δεδομένων έως εξωτερικές βάσεις δεδομένων. Αυτό απομονώνει τα δεδομένα σας, επιτρέποντάς του να διατηρηθεί σε οποιαδήποτε δομή που σας αρέσει, ενώ η θέα φροντίζει την παρουσίαση και τις ενημερώσεις.

Αυτό το σεμινάριο εισάγει τις βασικές πτυχές της αρχιτεκτονικής ModelView της QT και το χρησιμοποιεί για την κατασκευή απλής εφαρμογής Desktop TODO στο PYQT5.

Ελεγκτής προβολής μοντέλου

Μοντέλο – Δείτε – ελεγκτής (MVC) είναι μια αρχιτεκτονική χρήση μοτίβων για τις διεπαφές χρήστη ανάπτυξης που διαχωρίζει μια εφαρμογή σε τρία διασυνδεδεμένα μέρη. Αυτό διαχωρίζει την εσωτερική αναπαράσταση δεδομένων από τον τρόπο με τον οποίο παρουσιάζονται οι πληροφορίες και αποδέχονται από τον χρήστη.

Το MVC Design Pattenn fets τρία βασικά στοιχεία –

  • Μοντέλο Διατηρεί τη δομή δεδομένων με την οποία συνεργάζεται η εφαρμογή.
  • Θέα είναι οποιαδήποτε αναπαράσταση πληροφοριών όπως φαίνεται στον χρήστη, όπου γραφικά ή πίνακας. Επιτρέπονται πολλαπλές προβολές του ίδιου μοντέλου δεδομένων.
  • Ελεγχος Δέχεται εισροές από το χρήστη, μετατρέποντάς τον σε εντολές για το μοντέλο ή την προβολή.

Προσγειώνεται η διάκριση μεταξύ της προβολής και του ελεγκτή παίρνει λίγο σκοτεινό. Το QT δέχεται συμβάντα εισόδου από το χρήστη (μέσω του λειτουργικού συστήματος) και τα μεταφέρει στα widgets (ελεγκτής) για να χειριστεί. Ωστόσο, τα widgets χειρίζονται επίσης την παρουσίαση της τρέχουσας κατάστασης στον χρήστη, τοποθετώντας τα ευθέως στη θέα. Αντί να αγωνιστούμε για το πού να τραβήξουμε τη γραμμή, στο QT-S-speak η θέα και ο ελεγκτής είναι το ILEAD συγχωνεύθηκε με ένα μοντέλο/προβολή αρχιτεκτονικής “προβολή μοντέλου” για απλότητα.

Είναι σημαντικό ότι η διάκριση μεταξύ του δεδομένα και Πώς παρουσιάζεται διατηρείται.

Η προβολή μοντέλου

Το μοντέλο λειτουργεί ως διεπαφή μεταξύ του Store Data και του ViewController. Το μοντέλο κρατά τα δεδομένα (ή αναφορά σε αυτό) και παρουσιάζει αυτά τα δεδομένα μέσω ενός τυποποιημένου API που οι προβολές καταναλώνουν και παρουσιάζουν στον χρήστη. Πολλές προβολές μπορούν να μοιραστούν τα ίδια δεδομένα, παρουσιάζοντάς τα με εντελώς διαφορετικούς τρόπους.

Μπορείτε να χρησιμοποιήσετε οποιοδήποτε “Store Data” για το μοντέλο σας, που περιλαμβάνεται για παράδειγμα μια τυπική λίστα Python ή ένα λεξικό ή μια βάση δεδομένων (μέσω Ε.σολ. SQLALCHEMY).

Τα δύο μέρη είναι ουσιαστικά υπεύθυνα για –

  1. Τσάι μοντέλο Αποθηκεύει τα δεδομένα ή αναφορά σε αυτό και επιστρέφει ατομικά ή σειρές αρχείων και συναφή μεταδεδομένα ή απεικόνιση οδηγίες.
  2. Τσάι θέα Ζητά δεδομένα από το μοντέλο και εμφανίζει αυτό που επιστρέφεται στο widget.

Υπάρχει σε βάθος συζήτηση για την αρχιτεκτονική QT στην τεκμηρίωση.

Ο πλήρης οδηγός για τη συσκευασία εφαρμογών Python GUI με Pyinstaller.

Συσκευασία εφαρμογών Python με PyInstaller

[[έκπτωση.Έκπτωση_pc]]]% για την επόμενη [έκπτωση.Διάρκεια]] [Έκπτωση.Περιγραφή]] με τον κωδικό [έκπτωση.Κωδικός κουπονιού]]

Ισοτιμία αγοραστικής δύναμης

Προγραμματιστές στη [χώρα]] GET [[έκπτωση.έκπτωση_PC]]] Απενεργοποιήστε όλα τα βιβλία και τα μαθήματα με κωδικό [έκπτωση.Κωδικός κουπονιού]]

Μια απλή προβολή μοντέλου – μια λίστα TODO

Για να δείξουμε τον τρόπο χρήσης των ModelViews στην πράξη, θα συγκεντρώσουμε μια πολύ απλή εφαρμογή μιας λίστας επιφάνειας εργασίας Todo. Αυτό θα αποτελείται από ένα QListView για τη λίστα των στοιχείων, ένα QlineEdit για να εισαγάγετε νέα στοιχεία και ένα σύνολο κουμπιών για προσθήκη, διαγραφή ή επισήμανσης αντικειμένων όπως έγινε.

Το UI

Το απλό UI ήταν άσχημος δημιουργός QT και σώθηκε ως mainwindow.ui . Τσάι .Το αρχείο UI και όλα τα άλλα μέρη μπορούν να μεταφορτωθούν παρακάτω.

Σχεδιάζοντας μια απλή εφαρμογή Todo στο Qt Creator

Σχεδιάζοντας μια απλή εφαρμογή Todo στο Qt Creator

Η εφαρμογή τρέχουσα εμφανίζεται παρακάτω.

Το τρέξιμο Todo GUI (τίποτα δεν λειτουργεί ακόμα)

Το τρέξιμο Todo GUI (τίποτα δεν λειτουργεί ακόμα)

Τα widget που είναι διαθέσιμα στη διεπαφή που δώσαμε τα αναγνωριστικά που εμφανίζονται στον παρακάτω πίνακα.

οχλαχνικός Είδος Περιγραφή
δίσκο Qlistview Ο κατάλογος των τρέχουσας TODOS
ταδόνας Qlineedit Την είσοδο κειμένου για τη δημιουργία ενός νέου στοιχείου TODO
addbutton Qpushbutton Δημιουργήστε το νέο TODO, προσθέτοντας το στη λίστα TODOS
διαγραμμένος Qpushbutton Διαγράψτε το τρέχον επιλεγμένο TODO, αφαιρώντας το από τη λίστα TODOS
Πλήρης κουβέρτον Qpushbutton Σημειώστε το τρέχον επιλεγμένο TODO όπως γίνεται

Θα χρησιμοποιήσουμε αυτά τα αναγνωριστικά για να συνδέσουμε τη λογική της εφαρμογής αργότερα.

Το μοντέλο

Ορίζουμε το προσαρμοσμένο μοντέλο μας με υποκατηγορία από την εφαρμογή, επιτρέποντάς μας να επικεντρωθούμε στα μέρη μοναδικά για το μοντέλο μας. Το QT παρέχει πολλές διαφορετικές βάσεις μοντέλων, συμπεριλαμβανομένων λιστών, δέντρων και τραπεζιών (ιδανικά για υπολογιστικά φύλλα).

Για αυτό το παράδειγμα παρουσιάζουμε το αποτέλεσμα σε ένα qlistview . Το μοντέλο βασικής αντιστοίχισης για αυτό είναι το qabstractListModel . Ο ορισμός του περιγράμματος για το μοντέλο μας εμφανίζεται παρακάτω.

Τάση todomodel (qtcore.QabstractlistModel): def __init __ (self, *args, todos = none, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs).Todos = Todos ή [].DisplayRole: # Δείτε παρακάτω για τη δομή δεδομένων. Κατάσταση, κείμενο = εαυτός.Todos [Ευρετήριο.Row ()] # Επιστρέψτε μόνο το κείμενο TODO. Επιστροφή κειμένου Def RowCount (Self, Index): Επιστροφή Len (Self.Todos) 

Τσάι .Η μεταβλητή TODOS είναι το Store Data Store και οι δύο μεθόδους RowCount () και Data () είναι τυπικές μεθόδους μοντέλου που πρέπει για ένα μοντέλο λίστας. Θα περάσουμε από αυτά με τη σειρά τους παρακάτω.

.Λίστα Todos

Το κατάστημα δεδομένων για το μοντέλο μας είναι .Todos, μια απλή λίστα Python στην οποία θα αποθηκεύσουμε μια πλειάδα τιμών σε μορφή [(bool, str), (bool, str), (bool, str)] όπου το bool είναι το επομένως κατάσταση μιας δεδομένης καταχώρησης και το STR είναι το κείμενο του Todo.

Αρχικοποιούμε τον εαυτό σας.TODO σε μια κενή λίστα κατά την εκκίνηση, εκτός εάν μια λίστα μεταβιβαστεί μέσω του επιχειρήματος λέξεων -κλειδιών TODOS.

εαυτός.todos = todos ή [] θα θέσει τον εαυτό του.Todos στην παρεχόμενη τιμή TODOS εάν είναι φλυτζανώδης (Εγώ.μι. Οτιδήποτε άλλο εκτός από μια κενή λίστα, το boolean false ή καμία την προεπιλεγμένη τιμή), διαφορετικά θα ρυθμιστεί στην κενή λίστα [] .

Για να δημιουργήσουμε μια insance αυτού του μοντέλου μπορούμε απλά –

Μοντέλο = todomodel () # Δημιουργήστε μια κενή λίστα TODO 

Ή να περάσει σε μια υπάρχουσα λίστα –

todos = [(false, 'ένα στοιχείο'), (ψευδές, 'άλλο στοιχείο')] μοντέλο = todomodel (todos) 

.RowCount ()

Τσάι .Η μέθοδος RowCount () είναι Callade από την προβολή για να πάρει τον αριθμό των σειρών στα τρέχοντα δεδομένα. Αυτό απαιτείται για την προβολή μέχρι τώρα το μέγιστο δείκτη που μπορεί να επαναλάβει το κατάστημα δεδομένων (Count-1). Πώληση Χρησιμοποιούμε μια λίστα Python ως κατάστημα δεδομένων μας, η τιμή επιστροφής για αυτό είναι απλά το len () της λίστας.

.Δεδομένα ()

Αυτός είναι ο πυρήνας του μοντέλου σας, το οποίο χειρίζεται αιτήματα για δεδομένα από την προβολή και επιστρέφει το κατάλληλο αποτέλεσμα. Λαμβάνει δύο δείκτες και ρόλο παραμέτρων.

Ο δείκτης είναι η θέση/συντεταγμένες των δεδομένων που ζητά η προβολή, προσβάσιμη με δύο μεθόδους .Σειρά () και .στήλη () που δίνουν τη θέση σε κάθε διάσταση.

Για το QListView, η στήλη είναι πάντα 0 και μπορεί να αγνοηθεί, αλλά θα πρέπει να το χρησιμοποιήσετε για δεδομένα 2D σε προβολή υπολογιστικού φύλλου.

Ο ρόλος είναι μια σημαία που δείχνει το είδος των δεδομένων που ζητά η προβολή. Αυτό οφείλεται στο γεγονός ότι το .Η μέθοδος δεδομένων () έχει στην πραγματικότητα περισσότερη ευθύνη από τα βασικά δεδομένα. Διαχειρίζεται επίσης αιτήματα για πληροφορίες στυλ, συμβουλές εργαλείων, γραμμές κατάστασης κ.λπ. – Βασικά οτιδήποτε θα μπορούσε να ενημερωθεί από τα ίδια τα δεδομένα.

Η ονομασία του QT.Το DisplayRole είναι λίγο περίεργο, αλλά αυτό δείχνει ότι το θέα μας ζητά “παρακαλώ δώστε μου δεδομένα για προβολή”. Υπάρχουν άλλα ρόλοι Τα οποία μπορούν να λάβουν τα δεδομένα για αιτήματα styling ή ζητώντας δεδομένα σε μορφή “Επεξεργασία-έτοιμο”.

Ρόλος αξία Περιγραφή
ΕΤ.Απεικόνιση 0 Τα βασικά δεδομένα που πρέπει να καταργηθούν με τη μορφή κειμένου. (QString)
ΕΤ.Διακόσμηση 1 Τα δεδομένα που πρέπει να αποδοθούν ως διακόσμηση με τη μορφή ενός εικονιδίου. (Qcolor, Qicon ή Qpixmap)
ΕΤ.Σύνταξης 2 Τα δεδομένα σε επίσημη ακολουθία για επεξεργασία σε έναν επεξεργαστή. (QString)
ΕΤ.Εργαλειοθήκη 3 Τα δεδομένα που εμφανίζονται στην εργαλειοθήκη του αντικειμένου. (QString)
ΕΤ.Σταυστίδα 4 Τα δεδομένα που εμφανίζονται στη γραμμή κατάστασης. (QString)
ΕΤ.Whatsthisrole 5 Τα δεδομένα που εμφανίζονται για το στοιχείο στο “Τι είναι αυτό?” μόδα. (QString)
ΕΤ.Τρυφερό 13 Το μέγεθος του μεγέθους για το αντικείμενο που θα παραδοθεί στις προβολές. (QSize)

Για μια πλήρη λίστα διαθέσιμων ρόλοι που μπορείτε να λάβετε Δείτε την τεκμηρίωση QT Itmdatarole. Η λίστα μας TODO θα χρησιμοποιεί μόνο QT.DisplayRole και QT.Διακόσμηση .

Βασική εφαρμογή

Παρακάτω είναι η βασική εφαρμογή Stub που απαιτείται για τη φόρτωση του UI και την εμφάνιση της. Θα προσθέσουμε τον κωδικό μοντέλου και τη λογική εφαρμογής σε αυτήν τη βάση.

Εισαγωγή sys από pyqt5 import qtcore, qtgui, qtwidgets, uic από pyqt5.Qtcore import 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 ή [].DisplayRole: Κατάσταση, κείμενο = εαυτός.Todos [Ευρετήριο.Σειρά ()] επιστροφή κειμένου def rowcount (self, index): επιστροφή len (self.Todos) MainWindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (εαυτός).Setupui (εαυτός) εαυτός.Μοντέλο = todomodel () self.δίσκο.SetModel (εαυτός.Μοντέλο) app = qtwidgets.Qapplication (sys.Argv) Παράθυρο = Παράθυρο MainWindow ().Εμφάνιση () εφαρμογή.Exec_ () 

Ορίζουμε το todomodel όπως πριν και αρχικοποιούμε το αντικείμενο MainWindow. Στο __init__ για το mainwindow δημιουργούμε μια παρουσία του μοντέλου TODO και θέτουμε αυτό το μοντέλο στο TODO_VIEW . Αποθηκεύστε αυτό το αρχείο ως TODO.PY και τρέξτε το με –

Python3 Todo.βήμα 

Ενώ δεν υπάρχουν πολλά που πρέπει να δούμε ακόμα, το QListView και το μοντέλο μας λειτουργούν πραγματικά – αν προσθέσετε μερικά προεπιλεγμένα δεδομένα, θα δείτε εμφανίζονται στη λίστα.

εαυτός.model = todomodel (todos = [(false, 'my first todo')]))) 

QListView που δείχνει σκληρά κωδικοποιημένα αντικείμενα TODO

QListView που δείχνει σκληρά κωδικοποιημένα αντικείμενα TODO

Μπορείτε να συνεχίσετε να προσθέτετε αντικείμενα με το χέρι όπως αυτό και θα εμφανιστούν σε τάξη στο QlistView . Στη συνέχεια θα καταστήσουμε δυνατή την προσθήκη ITMs από την εφαρμογή.

Δημιουργήστε πρώτα μια νέα μέθοδο στο Mainwindow που ονομάζεται Add . Αυτή είναι η επανάκληση μας που θα φροντίσει να προσθέσει το τρέχον κείμενο από την είσοδο ως νέο Todo. Συνδέστε αυτήν τη μέθοδο στο AddButton.Πιεσμένο σήμα στο τέλος του μπλοκ __init__.

Κλάση MainWindow (qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (εαυτός).Setupui (εαυτός) εαυτός.Μοντέλο = todomodel () self.δίσκο.SetModel (εαυτός.Μοντέλο) # Συνδέστε το κουμπί. εαυτός.addbutton.τύπος.Σύνδεση (εαυτός.Προσθήκη) Def Add (Self): "" Προσθέστε ένα στοιχείο στη λίστα TODO, λαμβάνοντας το κείμενο από το QLineEdit .Todoedit και εκεί εκκαθαρίστε το. "" "Text = Self.ταδόνας.Κείμενο () εάν κείμενο: # Μην προσθέτετε κενές χορδές. # Πρόσβαση στη λίστα μέσω του μοντέλου. εαυτός.μοντέλο.Τόδος.Προσάρτημα ((ψευδές, κείμενο)) # Ανανέωση ενεργοποίησης. εαυτός.μοντέλο.διάταγμα.Emit () # Αδειάστε τον εαυτό του εισόδου.ταδόνας.Settext ("") 

Στην προσθήκη μπλοκ παρατηρήστε τον εαυτό σας.μοντέλο.διάταγμα.Εκπέμπουν () . Εδώ εκπέμπουμε ένα σήμα μοντέλου .layoutChanged για να ενημερώσει την άποψη ότι το σχήμα των δεδομένων έχουν τροποποιηθεί. Αυτό προκαλεί μια ανανέωση της οντότητας της προβολής. Εάν παραλείψετε αυτή τη γραμμή, το Todo θα εξακολουθεί να προστεθεί, αλλά το QListView δεν θα ενημερώσει.

Εάν τα δεδομένα τροποποιηθούν, αλλά ο αριθμός των σειρών/στηλών δεν επηρεάζεται, μπορείτε να χρησιμοποιήσετε το .Σήμα datachanged (). Αυτό ορίζει επίσης μια μεταβαλλόμενη περιοχή στα δεδομένα χρησιμοποιώντας μια κορυφαία και κάτω-δεξιά ενοικίαση για να αποφευχθεί η ανασύσταση ολόκληρης της προβολής.

Συνδέοντας τις άλλες ενέργειες

Μπορούμε τώρα να συνδέσουμε τα υπόλοιπα σήματα του κουμπιού και να προσθέσουμε βοήθεια για την απόδοση διαγράφω και πλήρης πράξεις. Προσθέτουμε τα σήματα κουμπιού στο μπλοκ __init__ όπως πριν.

 εαυτός.addbutton.τύπος.Σύνδεση (εαυτός.Προσθήκη) Εαυτός.διαγραμμένος.τύπος.Σύνδεση (εαυτός.Διαγραφή) Εαυτός.Πλήρης κουβέρτον.τύπος.Σύνδεση (εαυτός.Πλήρης) 

Στη συνέχεια, ορίστε μια νέα μέθοδο διαγραφής ως εξής –

 Def delete (self): indexes = self.δίσκο.ΕπιλεγμένοDIndexes () Εάν οι δείκτες: # INDEXES είναι μια λίστα με ένα μόνο στοιχείο σε μονό επιλογή. INDEX = INDEXES [0] # Αφαιρέστε το στοιχείο και ανανεώστε. Del Self.μοντέλο.Todos [Ευρετήριο.Σειρά ()] Εαυτός.μοντέλο.διάταγμα.Emit () # Καθαρίστε την επιλογή (καθώς δεν είναι πολύ έγκυρο). εαυτός.δίσκο.ClarSelection () 

Χρησιμοποιούμε τον εαυτό σας.δίσκο.επιλεγμένα dindexes για να πάρετε τα ευρετήρια (στην πραγματικότητα μια λίστα με ένα μόνο στοιχείο, όπως σε λειτουργία μονής επιλογής) και στη συνέχεια το .Σειρά () ως δείκτης στη λίστα των todos στο μοντέλο μας. Διαγράψουμε το στοιχείο ευρετηρίου χρησιμοποιώντας το Del Operator της Python και στη συνέχεια ενεργοποιούμε ένα σήμα layoutchanged επειδή το σχήμα των δεδομένων έχει τροποποιηθεί.

FIRALLLY, καθαρίζουμε την ενεργή επιλογή από το στοιχείο που σχετίζεται με τα όρια (αν είχατε επιλέξει το τελευταίο στοιχείο).

Θα μπορούσατε να δοκιμάσετε αυτό το έξυπνο και επιλέξτε το τελευταίο στοιχείο στη λίστα αντ ‘αυτού

Η πλήρης μέθοδος του αρέσει έτσι –

 Def complete (self): indexes = self.δίσκο.SelectRedIndexes () Εάν ευρετήρια: ευρετήριο = ευρετήρια [0] σειρά = ευρετήριο.Σειρά () Κατάσταση, κείμενο = εαυτός.μοντέλο.Todos [Row] Self.μοντέλο.Todos [Row] = (True, Text) # .Το Datachanged παίρνει πάνω αριστερά και κάτω δεξιά, τα οποία είναι ίσα # για μία μόνο επιλογή. εαυτός.μοντέλο.λευκής.Emit (ευρετήριο, δείκτης) # Καθαρίστε την επιλογή (καθώς δεν είναι πολύ έγκυρο). εαυτός.δίσκο.ClarSelection () 

Αυτό χρησιμοποιεί την ίδια ευρετηρίαση όπως για τη διαγραφή, αλλά αυτή τη φορά παίρνουμε το στοιχείο από το μοντέλο .λίστα Todos και στη συνέχεια αντικαταστήστε την κατάσταση με True .

Πρέπει να κάνουμε αυτή την ανάκτηση και αντικατάσταση, καθώς τα δεδομένα μας αποθηκεύονται ως πλειάδες Python που δεν μπορούν να τροποποιηθούν.

Το κλειδί διαφορετικό εδώ εναντίον. Τα τυπικά γραφικά στοιχεία QT είναι ότι κάνουμε αλλαγή απευθείας στα δεδομένα μας και πρέπει να ειδοποιήσουμε το QT που αλλάζει αυτόματα το Haasurd – η ενημέρωση της κατάστασης widget.

Χρήση QT.Διακόσμηση

Εάν εκτελέσετε την εφαρμογή τώρα θα πρέπει να διαπιστώσετε ότι η προσθήκη και διαγραφή και των δύο εργασιών, αλλά κατά την ολοκλήρωση των αντικειμένων λειτουργεί, δεν υπάρχει καμία ένδειξη για αυτό στην προβολή. Πρέπει να ενημερώσουμε το μοντέλο μας για να παρέχουμε την προβολή με έναν δείκτη για εμφάνιση όταν ολοκληρωθεί ένα στοιχείο. Το ενημερωμένο μοντέλο εμφανίζεται παρακάτω.

Σημειώστε = qtgui.Qimage ('tick.png ') κλάση todomodel (qtcore.QabstractlistModel): def __init __ (self, *args, todos = none, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs).Todos = Todos ή [].DisplayRole: _, Text = Self.Todos [Ευρετήριο.Σειρά ()] επιστροφή κειμένου εάν ρόλος == qt.DecorationRole: Κατάσταση, _ = Self.Todos [Ευρετήριο.Σειρά ()] αν Κατάσταση: επιστροφή tick def rowcount (self, index): επιστροφή len (self.Todos) 

Χρησιμοποιούσαν ένα εικονίδιο Tick Tick.PNG για να υποδείξετε πλήρη αντικείμενα, τα οποία φορτώνουμε σε ένα αντικείμενο Qimage που ονομάζεται Tick . Στο μοντέλο προωθήσαμε έναν χειριστή για το QT.DecorationRole που επιστρέφει το εικονίδιο Tick for Rows Who’s Status είναι αληθές (για πλήρη).

Το εικονίδιο που χρησιμοποιώ λαμβάνεται από τη φούγκα που έχει ρυθμιστεί από το P.Yusukekamiyamane

Intostad ενός εικονιδίου I μπορείτε επίσης να επιστρέψετε στο χρώμα, e.σολ. Qtgui.Qcolor («πράσινο») το οποίο θα σχεδιαστεί ως συμπαγές τετράγωνο.

Εκτέλεση της εφαρμογής θα πρέπει τώρα να μπορείτε να επισημάνετε τα στοιχεία ως πλήρη.

Το Todos σημειώθηκε πλήρης

Το Todos σημειώθηκε πλήρης

Ένα αποθηκευμένο κατάστημα δεδομένων

Η εφαρμογή μας Todo λειτουργεί ωραία, αλλά έχει ένα θανατηφόρο ελάττωμα-ξεχνά τα todos σας μόλις κλείσετε την εφαρμογή ενώ σκέφτεστε ότι δεν έχετε τίποτα να κάνετε όταν κάνετε μπορεί να συμβάλλετε στα βραχυπρόθεσμα συναισθήματα του zen, μακροπρόθεσμα είναι κακή ιδέα.

Η λύση είναι να εφαρμοστεί κάποια εκδρομή του Store Data Store. Η απλούστερη προσέγγιση είναι ένα απλό κατάστημα αρχείων, όπου φορτώνουμε αντικείμενα από ένα αρχείο JSON ή PICTE DICE κατά την εκκίνηση και γράψτε ξανά την αλλαγή.

Για να το κάνουμε αυτό ορίζουμε δύο νέες μεθόδους στο χέρι μας . Αυτά τα δεδομένα φόρτωσης από δεδομένα ονόματος αρχείου JSON.JSON (αν υπάρχει, αγνοώντας το σφάλμα αν δεν το κάνει) στον εαυτό σας.μοντέλο.Todos και γράψτε τον τρέχοντα εαυτό.μοντέλο.Todos έξω στο ίδιο αρχείο, αντίστοιχα.

 Def Load (Self): Δοκιμάστε: με ανοιχτό ('δεδομένα.json ',' r ') ως f: self.μοντέλο.Todos = json.Φόρτωση (f) Εξαίρεση εξαίρεση: Pass def save (self): με ανοιχτό ('δεδομένα.json ',' w ') ως f: data = json.Χωματερή (εαυτός.μοντέλο.Todos, στ) 

Για να επιμείνουμε στις αλλαγές στα δεδομένα που πρέπει να προσθέσουμε το .Αποθήκευση () Χειριστής στο τέλος οποιασδήποτε μεθόδου που τροποποιεί τα δεδομένα και το .LOAD () Χειρισμός στο μπλοκ __init__ μετά τη δημιουργία του μοντέλου.

Ο τελικός κωδικός μοιάζει με αυτόν –

Εισαγωγή sys import json από pyqt5 import qtcore, qtgui, qtwidgets, uic από pyqt5.Qtcore import qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = uic.Loaduduseype (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 ή [].DisplayRole: _, Text = Self.Todos [Ευρετήριο.Σειρά ()] επιστροφή κειμένου εάν ρόλος == qt.DecorationRole: Κατάσταση, _ = Self.Todos [Ευρετήριο.Σειρά ()] αν Κατάσταση: επιστροφή tick def rowcount (self, index): επιστροφή len (self.Todos) MainWindow (Qtwidgets.Qmainwindow, Ui_MainWindow): def __init __ (Self): Super (MainWindow, Self).__Στον εαυτό του.Setupui (εαυτός) εαυτός.Μοντέλο = todomodel () self.Φορτίο () εαυτός.δίσκο.SetModel (εαυτός.Μοντέλο) Εαυτός.addbutton.τύπος.Σύνδεση (εαυτός.Προσθήκη) Εαυτός.διαγραμμένος.τύπος.Σύνδεση (εαυτός.Διαγραφή) Εαυτός.Πλήρης κουβέρτον.τύπος.Σύνδεση (εαυτός.Πλήρης) def add (self): "" "Προσθέστε ένα στοιχείο στη λίστα TODO, λαμβάνοντας το κείμενο από το qlineedit .Todoedit και εκεί εκκαθαρίστε το. "" "Text = Self.ταδόνας.Κείμενο () εάν κείμενο: # Μην προσθέτετε κενές χορδές. # Πρόσβαση στη λίστα μέσω του μοντέλου. εαυτός.μοντέλο.Τόδος.Προσάρτημα ((ψευδές, κείμενο)) # Ανανέωση ενεργοποίησης. εαυτός.μοντέλο.διάταγμα.Emit () # Αδειάστε τον εαυτό του εισόδου.ταδόνας.Settext ("").Αποθήκευση () def delete (self): indexes = self.δίσκο.ΕπιλεγμένοDIndexes () Εάν οι δείκτες: # INDEXES είναι μια λίστα με ένα μόνο στοιχείο σε μονό επιλογή. INDEX = INDEXES [0] # Αφαιρέστε το στοιχείο και ανανεώστε. Del Self.μοντέλο.Todos [Ευρετήριο.Σειρά ()] Εαυτός.μοντέλο.διάταγμα.Emit () # Καθαρίστε την επιλογή (καθώς δεν είναι πολύ έγκυρο). εαυτός.δίσκο.ClarSelection () Self.Αποθήκευση () Def Completle (Self): Indexes = Self.δίσκο.SelectRedIndexes () Εάν ευρετήρια: ευρετήριο = ευρετήρια [0] σειρά = ευρετήριο.Σειρά () Κατάσταση, κείμενο = εαυτός.μοντέλο.Todos [Row] Self.μοντέλο.Todos [Row] = (True, Text) # .Το Datachanged παίρνει πάνω αριστερά και κάτω δεξιά, τα οποία είναι ίσα # για μία μόνο επιλογή. εαυτός.μοντέλο.λευκής.Emit (ευρετήριο, δείκτης) # Καθαρίστε την επιλογή (καθώς δεν είναι πολύ έγκυρο). εαυτός.δίσκο.ClarSelection () Self.Αποθήκευση () Def Load (Self): Δοκιμάστε: με ανοιχτό ('δεδομένα.db ',' r ') ως f: self.μοντέλο.Todos = json.Φόρτωση (f) Εξαίρεση εξαίρεση: Pass def save (self): με ανοιχτό ('δεδομένα.db ',' w ') ως f: data = json.Χωματερή (εαυτός.μοντέλο.todos, f) app = qtwidgets.Qapplication (sys.Argv) Παράθυρο = Παράθυρο MainWindow ().Εμφάνιση () εφαρμογή.Exec_ () 

Εάν τα δεδομένα στην αίτησή σας έχουν τη δυνατότητα να γίνουν μεγάλες ή πιο πολύπλοκες, μπορείτε να προτιμήσετε να χρησιμοποιήσετε μια πραγματική βάση δεδομένων για να την αποθηκεύσετε. Σε αυτή την περίπτωση το μοντέλο θα τυλίξει τη διεπαφή στη βάση δεδομένων και θα το ζητήσει απευθείας για την εμφάνιση δεδομένων. Το κάλυμμα l’ll πώς να το κάνετε αυτό σε ένα επερχόμενο σεμινάριο.

Για ένα άλλο ενδιαφέρον παράδειγμα ενός QListView, δείτε αυτό το παράδειγμα εφαρμογής Media Player. Χρησιμοποιεί το QT Building Qmediamplaylist ως DataStore, με την εμφάνιση περιεχομένων σε QlistView .

Σχετικά με το BCR.CX:

BCR.Το CX είναι μια εκκίνηση της τεχνολογίας της Βραζιλίας, εξειδικευμένη τόσο και στις δύο διαδικασίες outsourcing Business (BPO) και στο Outsourcing Business Environment (BEO), που επικεντρώνεται κυρίως στη δημιουργία ζήτησης, στην εμπειρία των πελατών, στην επικοινωνία, στην υποστήριξη χρήστη και την ικανοποίηση.

Περιγραφή:

Η εφαρμογή TODO αναπτύχθηκε ως ένας γρήγορος, ασφαλής και φιλικός προς το χρήστη τρόπο για την αποθήκευση των σημειώσεων του πράκτορα κατά τη διάρκεια των εργάσιμων ημερών.

Να είστε σε θέση να δημιουργήσετε και να διαχειριστείτε τις δικές σας εργασίες, με βάση κάθε μεμονωμένο εισιτήριο ή πελάτη.

Δημιουργήστε μονοπάτια και προσαρμόστε τη ροή εργασίας σας

Βελτιώστε την παραγωγικότητα! Χρησιμοποιώντας την εφαρμογή TODO Μπορείτε να δημιουργήσετε προσαρμοσμένες ροές εργασίας για να τυποποιήσετε τις επαναλαμβανόμενες διαδικασίες. Δοκιμάστε τώρα και αρχίστε να ελέγχετε την πρόοδό σας, όπως τα todos και το dones.

Πόροι:

  1. Δημιουργήστε εργασίες για κάθε εισιτήριο
  2. Μπάρα προόδου για την παραδοτέα παραδοτέα
  3. Δημιουργήστε τυποποιημένες ροές εργασίας για την ενίσχυση της παραγωγικότητας.
  4. Διαχειριστείτε τη λίστα εργασιών σας, προκειμένου να διατηρήσετε την καθημερινή σας ρουτίνα.
  1. Στοιβάζετε τόσο το Todo όσο και το Zendesk Sunshine για να αποκτήσετε πλήρη πρόσβαση στις λειτουργίες της εφαρμογής
  2. Βελτιώστε την παραγωγικότητα δημιουργώντας ή επεξεργασία αυτοματισμών εργασιών και αποθηκεύστε τις εξατομικευμένες προεπιλογές σας.