Todo w Mac App Store, za pomocą architektury ModelView PYQT5 do zbudowania prostej aplikacji TODO

ModelView Architecture QT S. interfejs podobny do MVC do wyświetlania danych w widokach

Uruchomiona aplikacja jest pokazana poniżej.

Todo 4+

Przez kilka lat korzystałem z tej aplikacji na moim iPadzie, iPhonie i MacBookPro. Jeśli nadal będzie działać idealnie na iOS, wydaje się, że nie w pełni przestrzegał ewolucji macOS.
Nie ma problemów z instalacją. Ale nie jest już możliwe synchroniza.
Dlatego staje się to dla mnie niepotrzebne … a pomoc ADVIGO nie wydaje się spieszyć, aby udzielić odpowiedzi na moją prośbę. Zawsze jest nieprzyjemne zauważanie, że pojęcie klienta traci nieco więcej jego wartości każdego dnia.

Pisa d

Od tej aktualizacji straciłem wszystkie moje listy w liczbie 12 i z którymi codziennie pracuję w profesjonalny sposób. Ta aktualizacja zarządzam około 200 miejsc, ta aktualizacja wprowadziła miesiące gruntu próby ! Wszystkie zadania zorganizowane na liście znajdowały się na jednej globalnej liście. Z pewnością nie ten błąd sprawi, że przejdę do wersji, mówiąc, że profesjonalista tego oprogramowania inaczej jest doskonała. Nigdy nie będę w niewoli. Pozostaje mi tylko poczekanie na odpowiedź wsparcia skontaktowanego dziś wieczorem przez e -mail lub znalezienie starej wersji tego wspaniałego oprogramowania. Naprawdę mam nadzieję, że jest to młodzieńczy beug nowej wersji, a nie strategia zmuszania do migracji do wersji płatnej pro, aby znaleźć funkcje już nabyte w poprzedniej wersji. Aby uzyskać informację, moja synchronizacja odbywa się z Dropbox

Surlepoint, 13.13.2011

Synchro to teraz nikiel

Złapałem przed synchronizacją, która była powolna, źle chodziłem itp. Ale teraz z iCloudem, to idealnie mi odpowiada.

Niektóre możliwe ulepszenia: więcej ustawień wyświetlania.
– Aby wyświetlić tylko to, czego używa użytkownik. Na przykład nie używam kontekstów ani etykiet (w każdym razie jeszcze nie) i chciałbym już nie wyświetlać tych opcji, które „zanieczyszczają” moje todo. Chciałbym mieć tylko „datę / priorytet / lista / typ” dla moich codziennych notatek i kliknięcia prawym przyciskiem myszy, aby uzyskać opcje, których rzadko używam
– I odwrotnie chciałbym prostego wyświetlacza PLSU niż menu zrzucania, aby wybrać datę, priorytet, listę, … jeśli mam tylko trzy listy, to trzy przyciski byłyby wystarczające do wyświetlenia i mógłbym wybrać moją listę jednym kliknięciem zamiast klikania menu Dow -Down, znajdź nazwę i kliknij ją. (Ditto dla priorytetu, zwłaszcza że przechodzimy od bardzo wizualnego rysunku na liście TODO do wyboru nazwy w opcjach, co nie jest zbyt naturalne.

To są szczegóły ergonomii. Podoba mi się prostota i wydajność todo, więc chciałbym, aby być jeszcze bardziej konfigurowalne, aby być jeszcze prostszym.

Aplikacja prywatności

Deweloper, ADVIGO, nie podał szczegółowych informacji na temat swoich prywatnych praktyk i obsługi danych do Apple. Aby uzyskać więcej informacji, zobacz politykę prywatności rozwoju.

Architektura ModelView
Interfejs podobny do MVC QT do wyświetlania danych w widokach

Gdy zaczniesz budować bardziej złożone aplikacje z PYQT5. Dane przechowywane w widżetach (e.G. Prosty QListWidget) nie jest łatwo dostępny do manipulowania z Python – zmiany wymagają uzyskania elementu, uzyskania danych, a następnie odłożenia go. Domyślnym rozwiązaniem jest zachowanie zewnętrznej reprezentacji danych w Pythonie, a następnie eith duplikat aktualizacji zarówno danych, jak i widżetu, lub po prostu przepisanie widżetu wihole z danych z danych. Może to szybko stać się brzydkie i powoduje dużo płyty kotłowni.

Na szczęście QT ma rozwiązanie do tego – ModelViews. ModelViews są potężną alternatywą dla standardowych widżetów wyświetlania, które wykorzystują regularny interfejs modelu do interakcji ze źródłami danych – od prostych struktur danych po zewnętrzne bazy danych. To izoluje Twoje dane, umożliwiając ich utrzymanie w dowolnej strukturze, podczas gdy widok zajmuje się prezentacją i aktualizacjami.

Ten samouczek wprowadza kluczowe aspekty architektury ModelView QT i wykorzystuje go do budowania prostej aplikacji Todo Desktop w PYQT5.

Kontroler widoku modelu

Model – patrz – kontroler (MVC) to wzór architektoniczny dla interfejsów użytkownika programistycznego, który dzieli aplikację na trzy połączone części. Oddziela to wewnętrzną reprezentację danych od tego, w jaki sposób informacje są prezentowane i akceptowane od użytkownika.

MVC Design Pattenn fets trzy główne komponenty –

  • Model Przechowuje strukturę danych, z którą aplikacja pracuje.
  • Pogląd to każde przedstawienie informacji, jak pokazano użytkownikowi, gdzie graficzne lub tabela. Dozwolone jest wiele widoków tego samego modelu danych.
  • Kontrola Akceptuje dane wejściowe od użytkownika, przekształcając go w polecenia dla modelu lub widoku.

Wyląduje rozróżnienie między widokiem a kontrolerem, staje się trochę mętne. QT przyjmuje zdarzenia wejściowe od użytkownika (za pośrednictwem systemu operacyjnego) i deleguje je do widżetów (kontrolera) do obsługi. Jednak widżety obsługują również prezentację bieżącego stanu dla użytkownika, umieszczając je wprost w widoku. Zamiast boleć, gdzie narysować linię, w QT-S-SPEAK Widok i kontroler są scalone ilead, przełączono modele/viewController-Called „Model View” dla uproszczenia.

Co ważne, rozróżnienie między dane I Jak to jest prezentowane jest zachowany.

Widok modelu

Model działa jako interfejs między magazynem danych a ViewController. Model przechowuje dane (lub odniesienie do niego) i przedstawia te dane za pośrednictwem standardowego interfejsu API, które wyświetlają następnie i przedstawiają użytkownikowi. Wiele widoków może udostępniać te same dane, prezentując je na zupełnie różne sposoby.

Możesz użyć dowolnego „magazynu danych” dla swojego modelu, na przykład standardowej listy lub słownika Pythona lub bazy danych (za pośrednictwem E.G. Sqlalchemy) – to zależy od Ciebie.

Dwie części są zasadniczo odpowiedzialne za –

  1. Herbata Model Przechowuje dane lub odniesienie do nich i zwraca indywidualne lub zakresy rekordów oraz powiązane metadane lub wyświetlacz instrukcje.
  2. Herbata pogląd Żąda danych z modelu i wyświetla to, co zwraca się na widżecie.

Dokumentuje się dogłębnej dyskusji na temat architektury QT w dokumentacji.

Kompletny przewodnik po aplikacjach GUI opakowania Python z PyInstaller.

Opakowanie Python Zastosowania z PyInstaller

[[rabat.Rabat_pc]]]% zniżki dla następnego [zniżka.czas trwania]] [zniżka.Opis]] z kodem [zniżka.Kod kuponu]]

Parytet siły nabywczej

Deweloperzy w [[kraju]] otrzymują [[zniżka.rabat_pc]]] Off na wszystkich książkach i kursach z kodem [zniżka.Kod kuponu]]

Prosty widok modelu – lista todo

Aby zademonstrować, jak korzystać z widoków modelowych w praktyce, zorganizujemy bardzo prostą implementację listy todo komputerów stacjonarnych. Będzie to składać się z QListView dla listy elementów, QlineEdit do wprowadzania nowych elementów oraz zestawu przycisków do dodawania, usuwania lub oznaczania elementów tak.

Interfejs użytkownika

Prosty interfejs użytkownika był brzydki qt twórca i zapisano jako MainWindow.UI . Herbata .plik interfejsu użytkownika i wszystkie pozostałe części można pobrać poniżej.

Projektowanie prostej aplikacji Todo w QT Creator

Projektowanie prostej aplikacji Todo w QT Creator

Uruchomiona aplikacja jest pokazana poniżej.

Bieżący GUI Todo (nic jeszcze nie działa)

Bieżący GUI Todo (nic jeszcze nie działa)

Widżety dostępne w interfejsie, które podaliśmy identyfikatory pokazane w poniższej tabeli.

objeuch Uprzejmy Opis
Todview QListView Lista obecnych todos
Tododit QlineEdit Wejście tekstu do utworzenia nowego elementu TODO
Addbutton Qpushbutton Utwórz nowe Todo, dodając go do listy TODOS
DeleteButton Qpushbutton Usuń bieżące wybrane todo, usuwając go z listy TODOS
Complete Button Qpushbutton Zaznacz bieżące wybrane todo, jak to zrobione

Użyjemy tych identyfikatorów, aby później podłączyć logikę aplikacji.

Model

Nasz model niestandardowy definiujemy podklasą na podstawie implementacji, umożliwiając nam skupienie się na częściach unikalnych dla naszego modelu. Qt dostarcza wiele różnych baz modeli, w tym listy, drzewa i tabele (idealne do arkuszy kalkulacyjnych).

W tym przykładzie wyświetlamy wynik do QListView . Dopasowany model podstawowy to QabstractModel . Definicja zarysu naszego modelu pokazano poniżej.

TODODEL CLASSODEL (QTCORE.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos lub [] def Data (self, indeks, rola): Jeśli rola == qt.DisplayRole: # patrz poniżej struktura danych. status, tekst = self.Todos [indeks.Row ()] # Zwróć tylko tekst TODO. Zwracaj tekst def rowCount (self, indeks): return len (self.todos) 

Herbata .Zmienna TODOS to nasz magazyn danych, a dwie metody rowCount () i data () to standardowe metody modelu, które musimy dla modelu listy. Przejdziemy przez nich kolejne z kolei poniżej.

.Lista TODOS

Sklep z naszym modelem jest .Todos, prosta lista Python, w której przechowujemy krotność wartości w formacie [(bool, str), (bool, str), (bool, str)] gdzie bool jest W związku z tym stan danego wpisu, a STR to tekst todo.

Inicjalizujemy siebie.Todo do pustej listy w uruchomieniu, chyba że lista zostanie przeniesiona za pośrednictwem argumentu słowa kluczowego TODOS.

samego siebie.todos = todos lub [] self.todos do dostarczonej wartości todosa, jeśli tak jest Truty (I.mi. Cokolwiek innego niż pusta lista, boolean false lub brak wartości domyślnej), w przeciwnym razie zostanie ona ustawiona na pustą listę [] .

Aby utworzyć zapanowanie tego modelu, możemy proste –

Model = todOdomodel () # Utwórz pustą listę TODO 

Lub przejść na istniejącej liście –

TODOS = [(false, „atem”), (false, „inny item”)] model = todomodel (todos) 

.Liczba wierszy ()

Herbata .Metoda RowCount () to Callade według widoku, aby uzyskać liczbę wierszy w bieżących danych. Jest to wymagane, aby widok do teraz maksymalnego indeksu może przerobić magazyn danych (liczba wierszy-1). Sprzedaż Korzystamy z listy Python jako naszego sklepu danych, wartością zwrotną dla tego jest po prostu len () listy.

.Dane ()

Jest to rdzeń twojego modelu, który obsługuje żądania danych z widoku i zwraca odpowiedni wynik. Otrzymuje dwa parametry wskaźnik i rolę.

Indeks to pozycja/współrzędne danych, o które prosi o widok, dostępny dwiema metodami .Wiersz () i .kolumna (), która daje pozycję w każdym wymiarze.

Dla naszego QListView kolumna jest zawsze 0 i można ją zignorować, ale musisz użyć tego dla danych 2D w widoku arkusza kalkulacyjnego.

Rola to flaga wskazująca Uprzejmy danych, o które prosi o widok. To dlatego, że .Metoda danych () faktycznie ponosi większą odpowiedzialność niż tylko podstawowe dane. Obsługuje również prośby o informacje o stylu, podpowiedzi, paski stanu itp. – Podstawowo wszystko, co mogłoby być poinformowane przez same dane.

Nazywanie QT.DisplayRole jest nieco dziwne, ale oznacza to, że pogląd pyta nas „Proszę, daj mi dane do wyświetlania”. Są inne Role Które dane mogą odbierać żądania stylizacji lub żądanie danych w formacie „edytuj”.

Rola Wartość Opis
Qt.Wyświetlacz 0 Kluczowe dane, które mają być renderowane w postaci tekstu. (QString)
Qt.Dekoracja 1 Dane, które mają być renderowane jako dekoracja w formie ikony. (Qcolor, Qicon lub QPixmap)
Qt.Redakcyjny 2 Dane w formalnym obserwowaniu w celu edytowania w edytorze. (QString)
Qt.Podpowiedź 3 Dane wyświetlane w podpowiedzi elementu. (QString)
Qt.Statustiprole 4 Dane wyświetlane na pasku stanu. (QString)
Qt.Whatsthisrole 5 Dane wyświetlane dla elementu w „Co to jest?„Moda. (QString)
Qt.Sizehintrole 13 Wskazówka rozmiaru elementu, który zostanie dostarczony do widoków. (QSize)

Aby uzyskać pełną listę dostępnych Role że możesz otrzymać dokumentację QT ITMDATAROLE. Nasza lista todo będzie używać tylko QT.DisplayRole i Qt.Dekoracja .

Podstawowa implementacja

Poniżej znajduje się podstawowa aplikacja Stub potrzebna do załadowania interfejsu użytkownika i wyświetlania go. Dodamy nasz kod modelu i logikę aplikacji do tej bazy.

Importuj Sys z PYQT5 Import QTCore, Qtgui, Qtwidgets, UIC z PYQT5.QTCORE Import QT_Creator_file = "MainWindow.ui "ui_mainWindow, qtbaseclass = UIC.LoadUuype (qt_creator_file) klasa todomodel (qtcore.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos lub [] def Data (self, indeks, rola): Jeśli rola == qt.DisplayRole: Status, tekst = self.Todos [indeks.Row ()] return Text def RowCount (self, indeks): return len (self self.TODOS) klasa MainWindow (qtwidgets.QMainWindow, UI_MainWindow): def __init __ (self): qtwidgets.QumainWindow.__init __ (self) ui_mainwindow.__init __ (ja) jaźń.Konfiguracja (ja) jaźń.Model = todomodel () self.Todview.SetModel (ja.Model) App = qtwidgets.Qapplication (sys.Argv) okno = mainWindow () okno.Show () aplikacja.Exec_ () 

Definiujemy nasz tomodel jak poprzednio i inicjujemy obiekt MainWindow. W __init__ dla MainWindow tworzymy instancję naszego modelu TODO i ustawiamy ten model na todo_view . Zapisz ten plik jako Todo.Py i uruchom go –

Python3 Todo.tempo 

Chociaż nie ma jeszcze wiele do zobaczenia, QListView i nasz model faktycznie działają – jeśli dodasz domyślne dane, zobaczysz, że pojawi się na liście.

samego siebie.model = todomodel (todos = [(false, „mój pierwszy todo ')])))))) 

QListView pokazujący twardy element TODO

QListView pokazujący twardy element TODO

Możesz ciągle dodawać elementy ręcznie w ten sposób, a one pojawią się w kolejności QListView . Następnie umożliwimy dodanie ITM z aplikacji.

Najpierw utwórz nową metodę na nazwie MainWindow Add . To jest nasze wywołanie zwrotne, które zajmie dodanie bieżącego tekstu z danych wejściowych jako nowego todo. Podłącz tę metodę z AddButton.Wciśnięty sygnał na końcu bloku __init__.

Klasa MainWindow (qtwidgets.QMainWindow, UI_MainWindow): def __init __ (self): qtwidgets.QumainWindow.__init __ (self) ui_mainwindow.__init __ (ja) jaźń.Konfiguracja (ja) jaźń.Model = todomodel () self.Todview.SetModel (ja.Model) # Podłącz przycisk. samego siebie.Addbutton.naciskać.Połącz (ja.Dodaj) def dodaj (self): „” Dodaj element do naszej listy TODO, pobieranie tekstu z QlineEdit .Todoedit i tam oczyszczenie. "" "tekst = self.Tododit.Text () Jeśli tekst: # nie dodawaj pustych sznurków. # Uzyskaj dostęp do listy za pomocą modelu. samego siebie.Model.Todos.Append ((false, text)) # Wyzwalacz odśwież. samego siebie.Model.Układu.Emitu () # opróżnij siebie.Tododit.Ustaw tekst ("") 

W dodaniu bloku zauważ linię siebie.Model.Układu.Emitować () . Tutaj emitujemy sygnał modelu .Układa się, aby poinformować widok, że kształt danych zostało zmienione. To wywołuje odświeżenie jednostki widoku. Jeśli pominiesz tę linię, Todo będzie nadal dodawane, ale QListView nie aktualizuje.

Jeśli tylko dane zostaną zmienione, ale liczba wierszy/kolumn nie ma wpływu, możesz użyć .Zamiast tego sygnał datachanged (). To definiuje również zmieniony region danych przy użyciu wynajmu górnego i prawego dolnego, aby uniknąć przerysowania całego widoku.

Podłączenie innych działań

Możemy teraz podłączyć resztę sygnałów przycisku i dodać pomoc w celu osiągnięcia wydajności usuwać I kompletny Operacje. Dodajemy sygnały przycisków do bloku __init__.

 samego siebie.Addbutton.naciskać.Połącz (ja.Dodaj) ja.DeleteButton.naciskać.Połącz (ja.Usuń) ja.Complete Button.naciskać.Połącz (ja.Kompletny) 

Następnie zdefiniuj nową metodę Delete w następujący sposób –

 Def Delete (self): indekses = self.Todview.selectedDindexes () Jeśli indeksy: # indeksy to lista pojedynczego elementu w jednym selekcie. Indeks = indeksy [0] # Wyjmij element i odśwież. Del self.Model.Todos [indeks.Row ()] self.Model.Układu.Emitu () # Wyczyść wybór (ponieważ nie jest on długo ważny). samego siebie.Todview.Clarselection () 

Używamy siebie.Todview.wybraneDindexes do uzyskania indeksów (właściwie lista pojedynczego elementu, podobnie jak my w trybie pojedynczego selekcji), a następnie .Row () jako indeks na naszej liście todos w naszym modelu. Usuwamy indeksowany element za pomocą operatora Del Pythona, a następnie wyzwalamy sygnał zmieniony układem, ponieważ kształt danych został zmodyfikowany.

Skończy się, wyczyścimy aktywny wybór, ponieważ element, do którego się odnosi, może teraz poza zasięgiem (jeśli wybrałeś ostatni element).

Możesz spróbować zrobić ten smartter i wybrać ostatni element na liście

Kompletna metoda lubi tak –

 Def Complete (self): indexes = self.Todview.SelectRedIndexes () Jeśli indeks: index = indekses [0] wiersz = indeks.Row () status, tekst = self.Model.Todos [row] self.Model.Todos [wiersz] = (true, text) # .DataChanged wymaga lewicy górnej i dolnej, które są równe # dla pojedynczego wyboru. samego siebie.Model.DataChanged.EMIT (indeks, indeks) # Wyczyść wybór (ponieważ nie jest to długi poprawny). samego siebie.Todview.Clarselection () 

Wykorzystuje to takie same indeksowanie, jak w przypadku usuwania, ale tym razem pobieramy element z modelu .Lista TODOS, a następnie zastąp status true .

Musimy wykonać to pobieranie, ponieważ nasze dane są przechowywane jako krotki Pythona, których nie można zmodyfikować.

Klucz inny tutaj vs. Standardowe widżety QT polega na tym, że wprowadzamy zmiany bezpośrednio do naszych danych, i najprawdopodobniej musimy powiadomić QT, że zmiany Haasurd – aktualizacja stanu widżetu jest obsługiwana automatycznie.

Za pomocą Qt.Dekoracja

Jeśli uruchomisz aplikację teraz, powinieneś stwierdzić, że dodanie i usuwanie obu działań, ale podczas wykonywania elementów działa, nie ma tego wskazania w widoku. Musimy zaktualizować nasz model, aby dostarczyć widok wskaźnik do wyświetlenia po zakończeniu elementu. Zaktualizowany model pokazano poniżej.

kick = qtgui.Qimage („tyk.png ') klasa todomodel (qtcore.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos lub [] def Data (self, indeks, rola): Jeśli rola == qt.DisplayRole: _, tekst = self.Todos [indeks.Row ()] Powrót tekst, jeśli rola == qt.Dekoracja: status, _ = self.Todos [indeks.Row ()] Jeśli status: return tick def rowCount (self, indeks): return len (self self.todos) 

Używali ikony kleszczy.PNG, aby wskazać kompletne elementy, które ładujemy do obiektu Qimage o nazwie Tick . W modelu zarejestrowaliśmy moduł obsługi QT.Dekoracja, która zwraca ikonę kleszcza dla rzędów, które jest prawdziwe (do pełnego).

Ikona, której używam, pochodzi z zestawu fugi przez P.Yusukekamiyamane

Ikona I ikony I możesz również powrócić do koloru, e.G. Qtgui.Qcolor („zielony”), który zostanie narysowany jako solidny kwadrat.

Uruchamianie aplikacji, którą powinieneś być w stanie oznaczyć elementy jako kompletne.

Todos zaznaczył kompletne

Todos zaznaczył kompletne

Utrzymujący sklep z transmisją danych

Nasza aplikacja do Todo działa ładnie, ale ma jedną fatalną wadę-zapomina o twoich todo, gdy tylko zamkniesz aplikację, myśląc, że nie masz nic do roboty, gdy zrobisz to, aby przyczynić się do krótkoterminowych uczuć zen, to prawdopodobnie jest to prawdopodobnie a kiepski pomysł.

Rozwiązaniem jest wdrożenie niektórych wypadów z utrzymującym się magazynem danych. Najprostszym podejściem jest prosty sklep z plikami, w którym ładujemy elementy z plik JSON lub marynaty podczas uruchamiania.

Aby to zrobić, definiujemy dwie nowe metody na naszej ręce . Te dane ładujące z danych nazwy pliku JSON.JSON (jeśli istnieje, ignorując błąd, jeśli nie) do siebie.Model.Todos i napisz bieżące ja.Model.Odpowiednio na ten sam plik do tego samego pliku.

 Def Load (self): spróbuj: z otwartym („Dane.json ', „r”) jako f: self.Model.TODOS = JSON.Załaduj (f) Wyjątek Wyjątek: Pass def Zapisz (self): z open („Dane.JSON ', „w”) jako f: data = json.Zrzucenie (ja.Model.Todos, F) 

Aby utrzymywać zmiany w danych, które musimy dodać .Save () Handler na końcu dowolnej metody, która modyfikuje dane i .Load () Handler do bloku __init__ po utworzeniu modelu.

Ostateczny kod wygląda tak –

Importuj sys import JSON z PYQT5 Import QTCore, Qtgui, Qtwidgets, UIC z PYQT5.QTCORE Import QT_Creator_file = "MainWindow.ui "ui_mainWindow, qtbaseclass = UIC.Ładowanie (qt_creator_file) tick = qtgui.Qimage („tyk.png ') klasa todomodel (qtcore.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.todos = todos lub [] def Data (self, indeks, rola): Jeśli rola == qt.DisplayRole: _, tekst = self.Todos [indeks.Row ()] Powrót tekst, jeśli rola == qt.Dekoracja: status, _ = self.Todos [indeks.Row ()] Jeśli status: return tick def rowCount (self, indeks): return len (self self.TODOS) klasa MainWindow (qtwidgets.QMainWindow, ui_mainWindow): def __init __ (self): super (mainWindow, self).__W sobie.Konfiguracja (ja) jaźń.Model = todomodel () self.Ładuj () jaźń.Todview.SetModel (ja.Model) ja.Addbutton.naciskać.Połącz (ja.Dodaj) ja.DeleteButton.naciskać.Połącz (ja.Usuń) ja.Complete Button.naciskać.Połącz (ja.Kompletne) def dodaj (self): „” „Dodaj element do naszej listy TODO, otrzymując tekst z QlineEdit .Todoedit i tam oczyszczenie. "" "tekst = self.Tododit.Text () Jeśli tekst: # nie dodawaj pustych sznurków. # Uzyskaj dostęp do listy za pomocą modelu. samego siebie.Model.Todos.Append ((false, text)) # Wyzwalacz odśwież. samego siebie.Model.Układu.Emitu () # opróżnij siebie.Tododit.SetText („”) self.Save () def delete (self): indekses = self.Todview.selectedDindexes () Jeśli indeksy: # indeksy to lista pojedynczego elementu w jednym selekcie. Indeks = indeksy [0] # Wyjmij element i odśwież. Del self.Model.Todos [indeks.Row ()] self.Model.Układu.Emitu () # Wyczyść wybór (ponieważ nie jest on długo ważny). samego siebie.Todview.Clarselection () self.Save () def complete (self): indexes = self.Todview.SelectRedIndexes () Jeśli indeks: index = indekses [0] wiersz = indeks.Row () status, tekst = self.Model.Todos [row] self.Model.Todos [wiersz] = (true, text) # .DataChanged wymaga lewicy górnej i dolnej, które są równe # dla pojedynczego wyboru. samego siebie.Model.DataChanged.EMIT (indeks, indeks) # Wyczyść wybór (ponieważ nie jest to długi poprawny). samego siebie.Todview.Clarselection () self.Save () def load (self): próbuj: z otwartym ('Dane.db ', „r”) jako f: self.Model.TODOS = JSON.Załaduj (f) Wyjątek Wyjątek: Pass def Zapisz (self): z open („Dane.db ', „w”) jako f: data = json.Zrzucenie (ja.Model.todos, f) app = qtwidgets.Qapplication (sys.Argv) okno = mainWindow () okno.Show () aplikacja.Exec_ () 

Jeśli dane w aplikacji mogą potencjalnie uzyskać duże lub bardziej złożone, możesz preferować skorzystanie z faktycznej bazy danych do przechowywania. W takim przypadku model zawiera interfejs do bazy danych i zapytanie go o wyświetlenie danych bezpośrednio. L’Ll Cover, jak to zrobić w nadchodzącym samouczku.

Kolejny interesujący przykład QListView można znaleźć w tej przykładowej aplikacji odtwarzacza multimedialnego. Wykorzystuje QMediPlayList budynku QT jako danych danych, z wyświetlaniem zawartości do QListView .

O BCR.CX:

Bcr.CX jest brazylijskim startupem technologicznym, specjalizowanym zarówno w procesach outsourcingu biznesowego (BPO), jak i outsourcingu środowiska biznesowego (BEO), głównie skoncentrowanego na generowaniu popytu, doświadczeniu klienta, komunikacji, wsparciu użytkownika i satysfakcji.

Opis:

Aplikacja Todo została opracowana jako szybki, bezpieczny i przyjazny dla użytkownika sposób przechowywania notatek agenta w dni robocze.

Być w stanie tworzyć i zarządzać własnymi zadaniami, na podstawie każdego biletu lub klienta.

Utwórz szlaki i dostosuj swój przepływ pracy

Zwiększanie wydajności! Za pomocą aplikacji TODO możesz tworzyć niestandardowe przepływy pracy, aby standaryzować powtarzające się procesy. Spróbuj teraz i zacznij kontrolować swoje postępy, jako twoje tody i doniony.

Zasoby:

  1. Utwórz zadania dla każdego biletu
  2. Pasek postępu, aby kontynuować dostawę
  3. Utwórz znormalizowane przepływy pracy, aby zwiększyć wydajność.
  4. Zarządzaj swoją listą zadań, aby utrzymać ją z codzienną rutyną.
  1. Ułóż zarówno Todo, jak i Zendesk Sunshine, aby uzyskać pełny dostęp do funkcji aplikacji
  2. Popraw wydajność, tworząc lub edytując automatyki zadań i zapisać spersonalizowane ustawienia wstępne.