ModelView Architecture qt S MVC-like rozhraní pro zobrazení dat v zobrazení
Spuštěná aplikace je uvedena níže.
Todo 4+
Několik let jsem tuto aplikaci použil na svém iPadu, mém iPhone a MacBookPro. Pokud na iOS nadále funguje, zdá se, že se to plně neselo na vývoji MacOS.
Žádné problémy s instalací. Ale již není možné synchronizovat s TOODLEDO na MacOS, zatímco to je i nadále možné na iOS: stejné identifikátory nejsou rozpoznány.
Proto se to pro mě stává zbytečným … a zdá se, že pomoc Appigo není ve spěchu, aby poskytl odpověď na mou žádost. Vždy je nepříjemné poznamenat, že koncept zákazníka každý den ztrácí o něco více své hodnoty.
Pisa d
Od této aktualizace jsem ztratil všechny své seznamy v počtu 12 a se kterým každý den pracuji profesionálně. Trvale spravuji přibližně 200 míst, tato aktualizace se dala na pozemní měsíce utrpení ! Všechny úkoly uspořádané v seznamu se ocitly seskupeny do jediného globálního seznamu. Určitě to není tato chyba, která mě přiměje předat do verze a říká, že profesionál tohoto softwaru jinak vynikající. Nikdy nebudu zajat. Zbývá jen pro mě, abych čekal na odpověď podpory kontaktovanou dnes večer e -mailem nebo poté nalezení staré verze tohoto nádherného softwaru. Opravdu doufám, že se jedná o mladistvou novou verzi a ne strategii, která by donutila migrovat do placené verze Pro nalezení funkcí již získaných s předchozí verzí. Pro informace se moje synchronizace provádí s Dropboxem
Surlepoint, 13/13/2011
Synchro je nyní nikl
Popadl jsem před synchronizací, která byla pomalá, chodil špatně atd. Ale teď s iCloudem mi to perfektně vyhovuje.
Některá možná vylepšení: Více nastavení zobrazení.
– Chcete -li zobrazit pouze to, co uživatel používá. Například nepoužívám kontexty ani štítky (v žádném případě ještě ne) a rád bych už tyto možnosti nevykazoval, které „znečišťují“ můj todo. Chtěl bych mít pouze „datum / prioritu / seznam / typ“ pro mé každodenní poznámky a kliknutím pravým tlačítkem pravým tlačítkem na možnosti, které zřídka používám
– A naopak bych chtěl jednoduchý displej PLSU než nabídka Drop -down, abych si vybral datum, prioritu, seznam, … Pokud mám pouze tři seznamy, stačí tři tlačítka a mohl bych si vybrat svůj seznam S jedním kliknutím namísto kliknutí na nabídku Drop -down najděte jméno a klikněte na něj. (Ditto pro prioritu, zejména to, že jdeme z velmi vizuálního výkresu na seznamu Todo na výběr jména v možnostech, které nejsou příliš přirozené.
To jsou ergonomické detaily. Líbí se mi jednoduchost a efektivitu Todo, takže bych chtěl, aby bylo ještě konfigurovatelnější být ještě jednodušší.
Aplikace ochrany osobních údajů
Developer, Appigo, neposkytl podrobnosti o svých soukromých praktikách a zacházení s daty společnosti Apple. Další informace naleznete v zásadách ochrany osobních údajů rozvoje.
Architektura modelview
Rozhraní MVC podobné QT pro zobrazení dat v zobrazení
Když začnete vytvářet složitější aplikace s PYQT5, pravděpodobně narazíte na udržování widgetů v synchronizaci s vašimi daty. Data uložená v widgetech (E.G. Jednoduchý qlistWidget) není snadno k dispozici pro manipulaci z Pythonu – změny vyžadují, abyste získali položku, získali data a poté je nastavili zpět. Výchozí řešení tohoto je udržovat externí reprezentaci dat v Pythonu a poté duplicitní aktualizace na data i widget, nebo jednoduše přepsat widget Wihole z dat. To může být ošklivé rychle a má za následek mnoho kotlů jen pro hraní dat.
Naštěstí má QT řešení pro toto – modelviews. ModelViews jsou výkonnou alternativou ke standardním widgetům zobrazení, které používají běžné rozhraní modelu k interakci se zdroji dat – od jednoduchých datových struktur po externí databáze. To izoluje vaše data a umožňuje jejich uchovávání v jakékoli struktuře, která se vám líbí, zatímco pohled se stará o prezentaci a aktualizace.
Tento tutoriál představuje klíčové aspekty architektury ModelView QT a používá jej k vytvoření jednoduché aplikace pro stolní počítače v PYQT5.
Model View Controller
Model – Viz – řadič (MVC) je použití architektonického vzorce pro rozhraní uživatelů, která rozděluje aplikaci do tří vzájemně propojených částí. To odděluje vnitřní reprezentaci dat od toho, jak jsou informace prezentovány a přijímány od uživatele.
MVC Design Pattenn Fets tři hlavní komponenty –
- Modelka Drží datovou strukturu, se kterou aplikace pracuje.
- Pohled je jakákoli reprezentace informací, jak je uvedeno uživateli, kde grafická nebo tabulka. Je povoleno více zhlédnutí na stejný datový model.
- Řízení Přijímá vstup od uživatele, přeměňuje jej na příkazy pro model nebo zobrazení.
Přistává Qt, rozlišení mezi pohledem a ovladačem je trochu kalný. QT přijímá vstupní události od uživatele (prostřednictvím OS) a deleguje je na widgety (řadič), aby zvládli. Widgety však také zpracovávají prezentaci aktuálního stavu uživateli a vkládají je přímo do pohledu. Spíše než agonizovat nad tím, kde nakreslit čáru, v Qt-S-SPEAK Zobrazit a ovladač jsou ilead sloučeny Togd Togd model/ViewController Architecture Called “Model View” pro jednoduchost.
Důležité je, že rozdíl mezi data a Jak je prezentováno je zachován.
Zobrazení modelu
Model funguje jako rozhraní mezi úložištěm dat a ViewController. Model drží data (nebo odkaz na to) a představuje tato data prostřednictvím standardizovaného API, které pohledy potom konzumují a prezentují uživateli. Více zhlédnutí může sdílet stejná data a prezentovat je úplně jinak.
Pro svůj model můžete použít libovolný „úložiště dat“, například standardní seznam Pythonů nebo slovníku nebo databázi (přes E.G. SQLALCHEMY) – je to na vás nepříznivě.
Za obě části jsou v zásadě odpovědné –
- Čaj Modelka Ukládá data nebo odkaz na to a vrací individuální nebo rozsahy záznamů a související metadata nebo Zobrazit instrukce.
- Čaj Pohled Vyžaduje data z modelu a zobrazuje to, co je vráceno na widgetu.
V dokumentaci probíhá hloubková diskuse o architektuře QT.
Kompletní průvodce balením aplikací Python GUI s Pyinstaller.

[[sleva.Diskontní_pc]]]% sleva na další [sleva.Doba trvání]] [Sleva.Popis]] s kódem [sleva.COPON_CODE]]]
Parita kupní síly
Vývojáři v [[[country]] získají [[sleva.diskontní_pc]]] vypnuto na všech knihách a kurzech s kódem [sleva.COPON_CODE]]]
Jednoduchý zobrazení modelu – seznam todo
Abychom demonstrovali, jak v praxi používat modelViews, sestavíme velmi jednoduchou implementaci seznamu Todo Desktop Todo. To se bude skládat z QListView pro seznam položek, QlineEdit pro zadávání nových položek a sady tlačítek, které lze přidat, smazat nebo označit položky, jak je to provedeno.
UI
Jednoduché uživatelské rozhraní bylo ošklivé výlet QT tvůrce a zachráněno jako MainWindow.Ui . Čaj .Soubor uživatelského rozhraní a všechny ostatní části si můžete stáhnout níže.

Navrhování jednoduché aplikace TODO ve tvůrci QT
Spuštěná aplikace je uvedena níže.

Běžící todo gui (zatím nic nefunguje)
Widgety dostupné v rozhraní jsme dostali ID zobrazené v tabulce níže.
| Objeuch | Druh | Popis |
|---|---|---|
| Todview | QListView | Seznam aktuálních todos |
| tododit | QlineEdit | Textový vstup pro vytvoření nové položky Todo |
| AddButton | Qpushbutton | Vytvořte nový todo a přidejte jej do seznamu todos |
| DeleteButton | Qpushbutton | Odstraňte aktuální vybraný ToDo a odeberete jej ze seznamu TODOS |
| CompleteButton | Qpushbutton | Označte aktuální vybraný todo jako hotovo |
Tyto identifikátory použijeme k připojení logiky aplikace později.
Model
Definujeme náš vlastní model podtřídou z implementace, což nám umožňuje soustředit se na části jedinečné pro náš model. QT poskytuje řadu různých modelových základen, včetně seznamů, stromů a stolů (ideální pro tabulky).
V tomto příkladu zobrazujeme výsledek k QListView . Odpovídajícím základním modelem je qabstractListModel . Definice obrysu našeho modelu je uvedena níže.
Třída toDododel (qtcore.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todododel, self).__init __ (*args, ** kwargs).ToDos = todos nebo [] DEF data (self, index, role): pokud role == QT.Displayrole: # Struktura dat viz níže. Stav, text = self.Todos [index.Row ()] # Vraťte pouze text Todo. Return Text Def RowCount (Self, Index): Return len (self.Todos) Čaj .Proměnná ToDos je náš úložiště dat a dvě metody RowCount () a Data () jsou standardní metody modelu, které musíme pro model seznamu. Projdeme je zase níže.
.Seznam todos
Úložiště dat pro náš model je .Todos, jednoduchý seznam pythonů, ve kterém budeme ukládat tuple hodnot ve formátu [(Bool, Str), (Bool, Str), (Bool, Str)], kde je Bool proto stav dané položky a STR je text ToDo.
Inicializujeme self.Todo na prázdný seznam při spuštění, pokud není seznam předán argumentem klíčového slova ToDos.
já.Todos = todos nebo [] se nastaví.todos k poskytnuté hodnotě todos, pokud ano TRUTY (i.E. Cokoli jiného než prázdný seznam, booleovská false nebo žádná výchozí hodnota), jinak bude nastaveno na prázdný seznam [] .
Abychom vytvořili spotřebu tohoto modelu, můžeme jednoduché –
Model = todomodel () # vytvořte prázdný seznam todo Nebo předat existující seznam –
toDos = [(false, 'a položka'), (false, 'další položka')] model = todododel (todos) .RowCount ()
Čaj .Metoda RowCount () je podle pohledu na získání počtu řádků v aktuálních datech. To je vyžadováno pro to, aby se zobrazoval nyní maximální index, který může opakovat úložiště dat (řádový počet 1). Prodej Používáme jako seznam Python jako náš úložiště dat, návratovou hodnotou je jednoduše Len () seznamu.
.Data ()
Toto je jádro vašeho modelu, který zpracovává požadavky na data z pohledu a vrátí vhodný výsledek. Přijímá dva parametry index a roli.
Index je pozice/souřadnice dat, o kterých pohled požaduje, přístupné dvěma metodami .Row () a .sloupec (), který dává pozici v každé dimenzi.
Pro náš QListView je sloupec vždy 0 a může být ignorován, ale musíte to použít pro 2D data v pohledu tabulky.
Role je vlajka označující druh údajů, které pohled požaduje. Je to proto, že .Metoda dat () má ve skutečnosti větší odpovědnost než jen základní data. Vyřizuje také požadavky na informace o stylu, popisů, stavové řády atd. – Basalely cokoli, co by mohlo být informováno samotnými údaji.
Pojmenování QT.Displayrole je trochu divný, ale to znamená, že Pohled se nás ptá: „Prosím, dejte mi data pro zobrazení“. Existují jiné role Které data mohou přijímat pro požadavky na styling nebo vyžádat data ve formátu „Edit-Ready“.
| Role | Hodnota | Popis |
|---|---|---|
| Qt.Zobrazit | 0 | Klíčová data, která mají být vykreslena ve formě textu. (QString) |
| Qt.Dekoracerole | 1 | Data, která mají být vykreslena jako dekorace ve formě ikony. (QColor, Qicon nebo QPIXMAP) |
| Qt.Redakční | 2 | Data ve formálním následování pro úpravy v editoru. (QString) |
| Qt.Ultiprol | 3 | Data zobrazená v popisku položky. (QString) |
| Qt.Statistiprol | 4 | Data zobrazená na stavovém řádku. (QString) |
| Qt.WhatsThisrole | 5 | Data zobrazená pro položku v „Co je to?„Móda. (QString) |
| Qt.SizeHintrole | 13 | Velikost nápovědy pro položku, která bude dodána k zobrazení. (Qsize) |
Úplný seznam dostupných role že můžete obdržet vidět dokumentaci QT ITMDatarole. Náš seznam Todo bude používat pouze QT.Displayrole a Qt.Dekoracerole .
Základní implementace
Níže je základní aplikace pro načtení uživatelského rozhraní a zobrazit ji. Do této základny přidáme náš modelový kód a logiku aplikace.
Import SYS z importu Pyqt5 qtcore, qtgui, qtwidgets, uic z pyqt5.Qtcore import qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = uic.Třída Loaduduyy (Qt_Creator_file) ToDododel (Qtcore.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todododel, self).__init __ (*args, ** kwargs).ToDos = todos nebo [] DEF data (self, index, role): pokud role == QT.Displayrole: Stav, text = self.Todos [index.Row ()] Return Text Def RowCount (self, index): návrat len (self.TODOS) třída MainWindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (já) Já.Setupui (self) já.Model = todododel () self.Todview.SetModel (self.Model) app = qtwidgets.Qapplication (sys.Argv) okno = okno MainWindow ().Show () App.Exec_ () Definujeme náš toDoModel jako dříve a inicializujeme objekt MainWindow. V __init__ pro MainWindow vytvoříme instanci našeho modelu TODO a nastavíme tento model na TODO_VIEW . Uložte tento soubor jako todo.Py a spusťte to s –
Python3 Todo.tempo I když ještě není co vidět, QListView a náš model skutečně fungují – pokud přidáte některá výchozí data, uvidíte, že se objeví v seznamu.
já.model = todododel (todos = [(false, 'můj první todo')]))))))))))))) 
QListView zobrazující pevně kódovanou položku Todo
Můžete pokračovat v přidávání položek jako je tento a oni se objeví v pořadí v QListView . Dále umožníme přidat ITM z aplikace.
Nejprve vytvořte novou metodu na MainWindow s názvem Add . Toto je naše zpětné volání, které se postará o přidání aktuálního textu ze vstupu jako nového ToDo. Připojte tuto metodu k AddButtonu.Stisknutím signálu na konci bloku __init__.
Třída Mainwindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (já) Já.Setupui (self) já.Model = todododel () self.Todview.SetModel (self.Model) # Připojte tlačítko. já.AddButton.lis.Connect (self.Přidat) def přidat (self): "" Přidejte položku do našeho seznamu Todo a získejte text z QlineEdit .ToDedit a tam to vyčistit. "" "Text = self.tododit.Text () Pokud text: # Nepřidávejte prázdné řetězce. # Přístup k seznamu prostřednictvím modelu. já.Modelka.Todos.Append ((false, text)) # Spouštějte obnovení. já.Modelka.Layoutchanged.Emit () # prázdné vstupní self.tododit.SetText ("") V oznámení o přidání bloku se linky samostatně.Modelka.Layoutchanged.Emit () . Zde vyzařujeme modelový signál .Layoutchanged a informoval názor, že tvar údajů bylo změněno. To spustí obnovení entity pohledu. Pokud vynecháte tento řádek, bude todo stále přidáno, ale QListView se nebude aktualizovat.
Pokud jsou změněna pouze data, ale počet řádků/sloupců není ovlivněn, můžete použít .Místo toho signál Datachanged (). To také definuje změněnou oblast v datech pomocí levého levého a dolního pravého pronájmu, aby se zabránilo přepracování celého pohledu pohledu.
Zapojení dalších akcí
Nyní můžeme propojit zbytek signálů tlačítka a přidat nápovědy pro výkon vymazat a kompletní operace. Přidáme signály tlačítek do bloku __init__ jako dříve.
já.AddButton.lis.Connect (self.Přidat) self.DeleteButton.lis.Connect (self.Smazat) self.CompleteButton.lis.Connect (self.Kompletní) Poté definujte novou metodu smazání následovně –
Def Delete (Self): indexes = self.Todview.SELECTEDDindexes () IF INDEXES: # INDEXES je seznam jedné položky v jednom výběru. Index = indexy [0] # Odstraňte položku a obnovte. Del self.Modelka.Todos [index.Row ()] Self.Modelka.Layoutchanged.Emit () # Vymažte výběr (protože není dlouho platný). já.Todview.Clarselection () Používáme já.Todview.SelectDindexes pro získání indexů (ve skutečnosti seznam jedné položky, jako jsme v režimu s jedním výběrem) a poté .Row () jako index do našeho seznamu todů na našem modelu. Odstraníme indexovanou položku pomocí operátora Python DEL a poté spustíme signál rozvržení, protože tvar dat byl upraven.
Nakonec si vyčistíme aktivní výběr, protože položka, na kterou se vztahuje, může nyní mimo hranice (pokud jste vybrali poslední položku).
Můžete zkusit udělat tento chytrý a místo toho vybrat poslední položku v seznamu
Kompletní metoda se taková ráda –
Def kompletní (self): indexes = self.Todview.SelectredIndexes () if indexes: index = indexes [0] řádek = index.Stav Row (), text = self.Modelka.Todos [Row] Self.Modelka.ToDos [řádek] = (true, text) # .Datachanged vezme horní levou a dolní doprava, které jsou stejné # pro jediný výběr. já.Modelka.Datachanged.Emit (index, index) # Vymažte výběr (protože není dlouho platný). já.Todview.Clarselection () To používá stejné indexování jako pro smazání, ale tentokrát načteme položku z modelu .Seznam todos a poté nahraďte stav pravdou .
Musíme to udělat načtení a ohraničení, protože naše data jsou uložena jako Python-tice, které nelze upravit.
Klíč odlišný zde vs. Standardní widgety QT je to, že provádíme změnu přímo na naše data a musíme jednoduše informovat QT, že změny Haasurd – aktualizace stavu widgetu je automaticky zpracovávána.
Pomocí Qt.Dekoracerole
Pokud nyní spustíte aplikaci, měli byste zjistit, že přidávání a mazání obou prací, ale při dokončování položek funguje, v pohledu není náznak toho náznaku toho. Musíme aktualizovat náš model, abychom poskytli zobrazení indikátoru, který se má zobrazit, když je položka dokončena. Aktualizovaný model je zobrazen níže.
tick = qtgui.Qimage ('tick.Třída PNG ') TODODEL (QTCORE.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todododel, self).__init __ (*args, ** kwargs).ToDos = todos nebo [] DEF data (self, index, role): pokud role == QT.Displayrole: _, text = self.Todos [index.ROW ()] Vrátit text, pokud role == Qt.Decorationrole: Status, _ = self.Todos [index.Row ()] If Status: return tick def rowCount (self, index): return len (self.Todos) Používali klíště ikony klíšťat.PNG pro označení kompletních položek, které načteme do objektu Qimage s názvem Tick . V modelu jsme implementovali obsluhu pro QT.Dekoracerole, který vrací ikonu klíštěte pro řádky, který je stav, je pravdivý (pro kompletní).
Ikona, kterou používám, je převzata z fugue stanovené P.Yusukekamiyamane
Intostad ikony i můžete se také vrátit k barvě, e.G. Qtgui.QColor (‘Green’), který bude nakreslen jako pevný čtverec.
Spuštění aplikace, kterou byste nyní měli být schopni označit položky jako kompletní.

Todos označil kompletní
Obchod s přetrváváním dat
Naše aplikace Todo funguje pěkně, ale má jednu fatální vadu-zapomíná na todos, jakmile zavřete aplikaci, zatímco si myslíte, že nemáte co dělat, když to uděláte, abyste přispěli k krátkodobým pocitům zenu, dlouhodobě je to pravděpodobně špatný nápad.
Řešením je implementovat určitý výlet přetrvávajícího úložiště dat. Nejjednodušším přístupem je jednoduchý úložiště souborů, kde načteme položky ze souboru JSON nebo okurky při spuštění a zapište zpět na změnu.
K tomu definujeme dvě nové metody na naší ruce . Tato data načítání z dat názvu souboru JSON.JSON (pokud existuje, ignoruje chybu, pokud tomu tak není).Modelka.Todos a napsat aktuální já.Modelka.Todos ven do stejného souboru.
DEF LOAD (Self): zkuste: s Open ('Data.json ',' r ') jako f: self.Modelka.Todos = JSON.Výjimka výjimky zatížení (f) Výjimka: Pass def Save (self): s otevřenými ('data.JSON ',' W ') AS F: Data = JSON.Skládka (self.Modelka.Todos, f) K přetrvávání změn dat musíme přidat .UVĚDĚT () Handler na konec jakékoli metody, která modifikuje data, a .Poté, co model vytvořil blok __init__, popisovače na load ().
Konečný kód vypadá takto –
Import Sys Import JSON Z PYQT5 Import Qtcore, Qtgui, Qtwidgets, UIC z Pyqt5.Qtcore import qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = uic.LOADUDUSEYPE (QT_CREATOR_FILE) KICK = QTGUI.Qimage ('tick.Třída PNG ') TODODEL (QTCORE.QabstractListModel): def __init __ (self, *args, todos = none, ** kwargs): super (todododel, self).__init __ (*args, ** kwargs).ToDos = todos nebo [] DEF data (self, index, role): pokud role == QT.Displayrole: _, text = self.Todos [index.ROW ()] Vrátit text, pokud role == Qt.Decorationrole: Status, _ = self.Todos [index.Row ()] If Status: return tick def rowCount (self, index): return len (self.TODOS) třída MainWindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): super (mainwindow, self).__V sobě.Setupui (self) já.Model = todododel () self.LOAD () Self.Todview.SetModel (self.Model) self.AddButton.lis.Connect (self.Přidat) self.DeleteButton.lis.Connect (self.Smazat) self.CompleteButton.lis.Connect (self.Kompletní) def přidat (self): "" "Přidejte položku do našeho seznamu Todo a získejte text z QlineEdit .ToDedit a tam to vyčistit. "" "Text = self.tododit.Text () Pokud text: # Nepřidávejte prázdné řetězce. # Přístup k seznamu prostřednictvím modelu. já.Modelka.Todos.Append ((false, text)) # Spouštějte obnovení. já.Modelka.Layoutchanged.Emit () # prázdné vstupní self.tododit.SetText ("") self.Save () def delete (self): indexes = self.Todview.SELECTEDDindexes () IF INDEXES: # INDEXES je seznam jedné položky v jednom výběru. Index = indexy [0] # Odstraňte položku a obnovte. Del self.Modelka.Todos [index.Row ()] Self.Modelka.Layoutchanged.Emit () # Vymažte výběr (protože není dlouho platný). já.Todview.Clarselection () self.Save () def dokončit (self): indexes = self.Todview.SelectredIndexes () if indexes: index = indexes [0] řádek = index.Stav Row (), text = self.Modelka.Todos [Row] Self.Modelka.ToDos [řádek] = (true, text) # .Datachanged vezme horní levou a dolní doprava, které jsou stejné # pro jediný výběr. já.Modelka.Datachanged.Emit (index, index) # Vymažte výběr (protože není dlouho platný). já.Todview.Clarselection () self.Save () def Load (self): zkuste: s otevřeným ('dat.db ',' r ') jako f: self.Modelka.Todos = JSON.Výjimka výjimky zatížení (f) Výjimka: Pass def Save (self): s otevřenými ('data.db ',' w ') jako f: data = json.Skládka (self.Modelka.todos, f) app = qtwidgets.Qapplication (sys.Argv) okno = okno MainWindow ().Show () App.Exec_ () Pokud mají data ve vaší aplikaci potenciál zvětšit se nebo složitější, můžete předběžně použít skutečnou databázi k uložení. V tomto případě model zabalí rozhraní do databáze a dotazuje jej přímo pro zobrazení dat. Obal L’ll, jak to udělat v nadcházejícím tutoriálu.
Další zajímavý příklad QListView naleznete v tomto příkladu aplikace pro přehrávač médií. Jako datový úsek používá QT Building QmediaPlayList s zobrazením obsahu na QListView .
O BCR.CX:
Bcr.CX je spuštění brazilského technologie, specializované jak na procesy outsourcingu podnikání (BPO), tak na outsourcing obchodního prostředí (BEO), hlavně zaměřený na generování poptávky, zkušenosti se zákazníky, komunikaci, uživatelská podpora a spokojenost.
Popis:
Aplikace TODO byla vyvinuta jako rychlý, bezpečný a uživatelsky přívětivý způsob, jak uložit poznámky agenta během pracovních dnů.
Být schopen vytvářet a spravovat své vlastní úkoly na základě každé jednotlivé lístky nebo zákazníka.
Vytvořte stezky a přizpůsobte svůj pracovní postup
Produktivita zvyšuje! Pomocí aplikace TODO můžete vytvořit přizpůsobené pracovní postupy pro standardizaci opakovaných procesů. Zkuste to hned a začněte ovládat svůj pokrok, jako vaše todos a dones.
Zdroje:
- Vytvářejte úkoly pro každou lístek
- Pokrokový panel k následnému následnému výnosu
- Vytvořte standardizované pracovní postupy pro zvýšení produktivity.
- Spravujte seznam úkolů, abyste jej udrželi s každodenní rutinou.
- Stock todo i Zendesk Sunshine, abyste získali plný přístup k funkcím aplikace
- Zlepšete produktivitu vytvořením nebo úpravou automatizací úkolů a uložte své osobní předvolby.

![NextPit_Samsung_Galaxy_Z_Fold_3_opened-w782[1]](https://www.winemoldova.com/wp-content/uploads/2023/10/nextpit_samsung_galaxy_z_fold_3_opened-w7821-308x308.jpg)