Basit bir Todo uygulaması oluşturmak için PYQT5 ModelView mimarisini kullanarak Mac App Store’da Todo

Görünümlerde verileri görüntülemek için ModelView Architecture Qt S MVC benzeri arayüz

Koşu uygulaması aşağıda gösterilmiştir.

Todo 4+

Birkaç yıl boyunca bu uygulamayı iPad’imde, iPhone’umda ve MacBookpro’mda kullandım. İOS üzerinde mükemmel bir şekilde çalışmaya devam ederse, macOS’un evrimini tam olarak takip etmediği anlaşılıyor.
Yüklemede sorun yok. Ancak macOS’ta toodledo ile senkronize etmek artık mümkün değil, ancak iOS’ta mümkün olmaya devam ediyor: Aynı tanımlayıcılar tanınmıyor.
Bu nedenle benim için gereksiz hale geliyor … ve Appigo’nun yardımı, isteğime cevap vermek için acele etmiyor gibi görünüyor. Müşteri kavramının her gün değerini biraz daha fazla kaybettiğini belirtmek her zaman tatsızdır.

Pisa D

Bu güncellemeden bu yana, tüm listelerimi 12 sayısında kaybettim ve her gün profesyonel bir şekilde çalıştığım. Yaklaşık 200 noktayı kalıcı olarak yönetiyorum, bu güncelleme çilenin zemin aylarını koydu ! Listede düzenlenen tüm görevler kendilerini tek bir küresel listede gruplandırılmış buldu. Bu yazılımın profesyonelini söyleyen sürüme geçmemi sağlayacak kesinlikle bu hata değil, aksi takdirde mükemmel. Asla esir olmayacağım. Sadece bu akşam e -posta yoluyla temasa geçilen desteğin yanıtını beklemek benim için kalıyor veya bu muhteşem yazılımın eski sürümünü bulmak. Umarım bu yeni sürümün genç bir beug’udur ve önceki sürümle zaten edinilmiş işlevsellikleri bulmak için ücretli Pro sürümüne geçmeye zorlanacak bir strateji değildir. Bilgi için senkronizasyonum Dropbox ile yapıldı

Surlepoint, 12/13/2011

Senkro şimdi nikel

Yavaş, kötü yürüdü, vb. Senkronizasyondan önce yakaladım. Ama şimdi iCloud ile bana mükemmel uyuyor.

Bazı olası iyileştirmeler: daha fazla görüntüleme ayarı.
– Yalnızca kullanıcının kullandıklarını görüntülemek için. Örneğin, bağlamlar veya etiketler kullanmıyorum (henüz her durumda) ve artık benim todo’umu “kirleten” bu seçenekleri görüntülemiyorum. Günlük notlarım için yalnızca “Tarih / Öncelik / Liste / Tür” ve nadiren kullandığım seçenekler için sağ tıklamak istiyorum
– Ve tersine, tarihi, önceliğini, listeyi, … sadece üç listem varsa, üç düğme görüntülenmesi yeterli olurdu ve listemi seçebilirim. Bırakma menüsüne tıklamak yerine tek bir tıklama ile adı bulun ve üzerine tıklayın. (Öncelik için Ditto, özellikle Todo listesindeki çok görsel bir çizimden çok doğal olmayan seçeneklerde bir isim seçeneğine geçiyoruz.

Bunlar ergonomi detayları. Todo’nun sadeliğini ve verimliliğini seviyorum, bu yüzden daha da basit olmak için daha da yapılandırılabilir olmasını istiyorum.

Gizlilik Uygulaması

Geliştirici Appigo, özel uygulamaları ve verilerin Apple’a işlenmesi hakkında ayrıntılar sağlamadı. Daha fazla bilgi için gelişimin gizlilik politikasına bakın.

ModelView mimarisi
QT’nin görünümlerde verileri görüntülemek için MVC benzeri arayüzü

PYQT5 ile daha karmaşık uygulamalar oluşturmaya başladığınızda, verilerinizle senkronize olarak widget’ları korumakla karşılaşacaksınız. Widget’larda depolanan veriler (e.G. Basit bir QListWidget) Python’dan manipüle etmek için kolayca mevcut değildir – değişiklikler bir öğe almanızı, verileri almanızı ve ardından geri ayarlamanızı gerektirir. Bunun varsayılan çözümü, Python’da harici bir veri temsilini tutmak ve daha sonra hem verilerde hem de widget’taki güncellemeleri yinelemek veya verilerden Wihole Widget’ı yeniden yazmaktır. Bu hızlı bir şekilde çirkinleşebilir ve sadece verileri ele almak için çok fazla daha fazla kaynak ile sonuçlanır.

Neyse ki QT’nin bunun için bir çözümü var – ModelViews. ModelViews, basit veri yapılarından harici veritabanlarına kadar veri kaynaklarıyla etkileşim kurmak için normal bir model arayüzü kullanan standart ekran widget’larına güçlü bir alternatiftir. Bu, verilerinizi izole ederek istediğiniz herhangi bir yapıda tutulmasına izin verirken, görünüm sunum ve güncellemelerle ilgilenir.

Bu öğretici, QT’nin ModelView mimarisinin temel yönlerini tanıtır ve PYQT5’te basit masaüstü todo uygulaması oluşturmak için kullanır.

Model Görünüm Denetleyicisi

Model – Bkz. Kontrolör (MVC), bir uygulamayı birbirine bağlı üç parçaya bölen geliştirme kullanıcı arayüzleri için mimari bir desen kullanımıdır. Bu, verilerin dahili temsilini, bilginin kullanıcıya nasıl sunulduğu ve kabul edildiğinden ayırır.

MVC Design Pattent üç ana bileşeni feshediyor –

  • Model Uygulamanın birlikte çalıştığı veri yapısını tutar.
  • Görüş grafik veya tabloda gösterildiği gibi bilgilerin herhangi bir temsilidir. Aynı veri modelinin birden fazla görünümüne izin verilir.
  • Kontrol Kullanıcıdan girdiyi kabul eder, model veya görünüm için komutlara dönüştürür.

Görünüm ve denetleyici arasındaki ayrım biraz karanlıklaşır. QT, kullanıcıdan (işletim sistemi aracılığıyla) giriş olaylarını kabul eder ve bunları işlemek için widget’lara (denetleyiciye) devreder. Bununla birlikte, widget’lar mevcut durumun kullanıcıya sunumunu da ele alarak onları görünümüne koyarak. Çizginin nereden çizileceği konusunda acı çekmek yerine, QT-SPEAK’da görünüm ve denetleyici birleştirildi Birleştirildi Bir model/ViewController mimarisi olarak adlandırılan “Model Görünümü” adlı “Model Görünümü”.

Önemli olarak, arasındaki ayrım veri Ve Nasıl sunulur Korundu.

Model Görünümü

Model, veri deposu ile ViewController arasındaki arayüz olarak işlev görür. Model verileri (veya ona referans) tutar ve bu verileri, daha sonra kullanıcıya tüketen ve sunan standartlaştırılmış bir API aracılığıyla sunar. Birden çok görünüm aynı verileri paylaşabilir ve tamamen farklı şekillerde sunabilir.

Modeliniz için, örneğin standart bir python listesi veya sözlük veya bir veritabanı dahil herhangi bir “veri deposu” kullanabilirsiniz (E aracılığıyla (E aracılığıyla.G. Sqlalchemy) – bu tamamen size kalmış.

İki bölüm esasen sorumludur –

  1. Çay model Verileri veya referansları saklar ve bireysel veya kayıt aralıklarını ve ilişkili meta veri veya görüntülemek talimatlar.
  2. Çay görüş Modelden veri ister ve widget’a döndürülenleri görüntüler.

Belgelerde QT mimarisinin derinlemesine tartışılması var.

Pyinstaller ile Python GUI uygulamaları ambalajlama için tam kılavuz.

Pyinstaller ile ambalaj python uygulamaları

[[indirim.İndirim_pc]] bir sonraki [indirim için% indirim.süre]] [İndirim.Açıklama]] kodla [indirim.Kupon Kodu]]

Satın alma gücü paritesi

[[Ülke]] ‘deki geliştiriciler [[indirim.İndirim_pc]]] Kod ile tüm kitap ve kurslarda [indirim.Kupon Kodu]]

Basit Bir Model Görünümü – Bir Todo Listesi

ModelViews’in pratikte nasıl kullanılacağını göstermek için, bir masaüstü todo listesinin çok basit bir uygulamasını bir araya getireceğiz. Bu, öğeler listesi için bir QListView, yeni öğeler girmek için bir QlineDiT ve yapıldığı gibi öğeleri eklemek, silmek veya işaretlemek için bir dizi düğmeden oluşacaktır.

UI

Basit kullanıcı arayüzü QT Creator’ı çirkin gezdi ve Mainwindow olarak kaydedildi.UI . Çay .UI dosyası ve diğer tüm parçalar aşağıda indirilebilir.

Qt Creator'da basit bir Todo uygulaması tasarlamak

Qt Creator’da basit bir Todo uygulaması tasarlamak

Koşu uygulaması aşağıda gösterilmiştir.

Koşu Todo GUI (henüz işe yaramadı)

Koşu Todo GUI (henüz işe yaramadı)

Aşağıdaki tabloda gösterilen kimlikleri verdik arayüzde bulunan widget’lar.

objeuch Tür Tanım
Todview QListView Mevcut Todos listesi
Tododit QlineDit Yeni bir TODO öğesi oluşturmak için metin girişi
addbutton Qpushbutton Todos listesine ekleyerek yeni Todo’yu oluşturun
Silebutton Qpushbutton Todos listesinden kaldırarak seçilen geçerli Todo’yu silin
Tamamen Button Qpushbutton Seçilen Todo’yu yapıldığı gibi işaretleyin

Bu tanımlayıcıları daha sonra uygulama mantığını bağlamak için kullanacağız.

Model

Özel modelimizi, modelimize özgü parçalara odaklanmamızı sağlayarak uygulamadan alt sınıflara göre tanımlıyoruz. QT, listeler, ağaçlar ve tablolar dahil olmak üzere bir dizi farklı model tabanını sunar (elektronik tablolar için ideal).

Bu örnek için sonucu bir QListView’a gösteriyoruz . Bunun için eşleşen temel modeli QabStractListModel . Modelimiz için anahat tanımı aşağıda gösterilmiştir.

Sınıf toDomodel (qtcore.QabstractListModel): def __init __ (benlik, *args, todos = none, ** kwargs): süper (todomodel, self).__init __ (*args, ** kwargs) benlik.Todos = Todos veya [] DEF verileri (self, dizin, rol): Rol == Qt ise.DisplayRole: # Veri yapısı için aşağıya bakın. Durum, metin = benlik.Todos [dizin.Row ()] # Yalnızca Todo metnini döndür. Dönüş metni def rowcount (self, dizin): return len (self.Todos) 

Çay .Todos değişkeni veri depomuzdur ve iki yöntem rowCount () ve data () bir liste modeli için standart model yöntemleridir. Bunları sırayla aşağıda inceleyeceğiz.

.Todos listesi

Modelimiz için veri deposu .Todos, Bool’un BOOL’dur Öyleyse belirli bir girişin durumu ve STR Todo’nun metnidir.

Kendini başlatıyoruz.Todos Anahtar Kelime bağımsız değişkeni üzerinden bir liste geçmedikçe başlangıçta boş bir listeye girin.

kendi kendine.Todos = todos veya [] kendini.eğer varsa sağlanan todos değerine todos sakatlık (Ben.e. Boş bir liste dışında herhangi bir şey, boolean false veya hiçbiri varsayılan değer), aksi takdirde boş listeye ayarlanır [] .

Bu modelin bir iç kısmını oluşturmak için basit olabiliriz –

Model = ToDomodel () # Boş bir Todo Listesi Oluştur 

Veya mevcut bir listeye geçmek için –

todos = [(false, 'bir öğe'), (false, 'başka bir öğe')] model = ToDomodel (Todos) 

.Rowcount ()

Çay .RowCount () yöntemi, geçerli verilerdeki satır sayısını elde etmek için görünüme göre callade’dir. Veri deposunu yeniden yapabileceği maksimum dizin (satır sayısı-1) görünüm için bu gereklidir. Satış Bir Python Listesi Veri depomuz olarak kullanıyoruz, bunun geri dönüş değeri sadece listenin len ().

.Veri ()

Bu, görünümden veri taleplerini işleyen ve uygun sonucu döndüren modelinizin özüdür. İki parametre dizin ve rolü alır.

Dizin, görünümün talep ettiği verilerin konumu/koordinatlarıdır, iki yöntemle erişilebilir .Row () ve .her boyuttaki konumu veren sütun ().

QListView’imiz için sütun her zaman 0’dır ve göz ardı edilebilir, ancak bunu bir e -tablo görünümünde 2D veriler için kullanmanız gerekir.

Rol, tür görünümün talep ettiği verilerin. Çünkü .Data () yönteminin aslında sadece temel verilerden daha fazla sorumluluğu var. Ayrıca stil bilgileri, araç ipuçları, durum çubukları, vb. – Verilerin kendisi tarafından bilgilendirilebilecek her şey.

Qt adlandırılması.Displayrole biraz garip, ancak bu görüş bize “lütfen bana ekran için veri ver” diye soruyor. Başka var roller Verilerin isteği şekillendirme veya “düzenlemeye hazır” formatında veri istemek için hangi verilerin alabileceği.

Rol Değer Tanım
Qt.Görüntülemek 0 Metin şeklinde sunulacak temel veriler. (QString)
Qt.Dekorasyonel 1 Bir simge şeklinde bir dekorasyon olarak işlenecek veriler. (QColor, Qicon veya Qpixmap)
Qt.Başyazı 2 Bir editörde düzenleme için resmi bir takipte veriler. (QString)
Qt.Araç 3 Öğenin araç ipuçunda görüntülenen veriler. (QString)
Qt.Statustiprole 4 Durum çubuğunda görüntülenen veriler. (QString)
Qt.Whatthisrole 5 “Bu nedir?” moda. (QString)
Qt.Boyutu 13 Görünümlere sağlanacak öğenin boyutu ipucu. (QSIZE)

Mevcut tam bir liste için roller qt itmdatarole belgelerini görünce alabilirsiniz. Todo listemiz sadece QT kullanıyor.Displayrole ve Qt.Dekorasyonel .

Temel Uygulama

Aşağıda kullanıcı arayüzünü yüklemek ve görüntülemek için gereken temel saplama uygulaması. Model kodumuzu ve uygulama mantığımızı bu tabana ekleyeceğiz.

PYQT5'ten Sys İçe Aktarım qtcore, QtGui, Qtwidgets, PYQT5'ten UIC.Qtcore ithalat qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = UIC.LoadUDUYPE (QT_Creator_File) Sınıf ToDomodel (Qtcore.QabstractListModel): def __init __ (benlik, *args, todos = none, ** kwargs): süper (todomodel, self).__init __ (*args, ** kwargs) benlik.Todos = Todos veya [] DEF verileri (self, dizin, rol): Rol == Qt ise.DisplayRole: Durum, metin = self.Todos [dizin.Row ()] dönüş metni def rowcount (self, dizin): return len (self.Todos) Sınıf Mainwindow (Qtwidgets.QmainWindow, UI_MainWindow): Def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (benlik) benlik.Setupui (benlik) benlik.Model = ToDomodel () Benlik.Todview.Setmodel (benlik.Model) App = Qtwidgets.Qapplication (Sys.Argv) pencere = mainwindow () penceresi.Show () uygulaması.Exec_ () 

ToDomodel’imizi daha önce olduğu gibi tanımlıyoruz ve Mainwindow nesnesini başlatıyoruz. Mainwindow için __init__’da TODO modelimizin bir örneğini oluşturuyoruz ve bu modeli todo_view üzerinde ayarlıyoruz . Bu dosyayı todo olarak kaydedin.Py ve çalıştırın –

Python3 Todo.adımlamak 

Henüz görülecek çok şey olmasa da, QListView ve modelimiz gerçekten çalışıyor – bazı varsayılan veriler eklerseniz, listede göründüğünü göreceksiniz.

kendi kendine.Model = toDomodel (todos = [(yanlış, 'ilk todo'm')))))) 

QLISTVIEW Sabit kodlu Todo öğesini gösteren

QLISTVIEW Sabit kodlu Todo öğesini gösteren

Bu tür öğeleri manuel olarak eklemeye devam edebilirsiniz ve QListView’da sırayla görünecekler . Ardından, uygulamanın içinden ITM’leri eklemeyi mümkün kılacağız.

Önce Mainwindow’da yeni bir yöntem oluşturun . Bu, girişten mevcut metni yeni bir todo olarak eklemeye özen gösterecek geri aramamız. Bu yöntemi AddButton’a bağlayın.__İnit__ bloğunun sonunda basılmış sinyal.

Sınıf Mainwindow (Qtwidgets.QmainWindow, UI_MainWindow): Def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (benlik) benlik.Setupui (benlik) benlik.Model = ToDomodel () Benlik.Todview.Setmodel (benlik.Model) # Düğmeyi bağlayın. kendi kendine.addbutton.basmak.Connect (benlik.Ekle) def ekle (self): "" TODO listemize bir öğe ekleyin, metni QLineLedit'ten alıyorum .Todoedit ve orada temizleme. "" "metin = self.Tododit.Text () Metin: # boş dizeler eklemeyin. # Model üzerinden listeye erişin. kendi kendine.model.todos.Append ((yanlış, metin)) # Tetikleyici Yenileme. kendi kendine.model.layoutchanged.Emit () # giriş benliğini boşaltın.Tododit.Metin ayarla ("") 

Blok ekle, çizginin benliğine dikkat edin.model.layoutchanged.Emit () . Burada bir model sinyali yayıyoruz .görünümün şekil verilerin değiştirilmesi. Bu, görüşün bir yenilemesini tetikler. Bu satırı atlarsanız, Todo yine de eklenecek, ancak QListView güncellenmeyecek.

Sadece veriler değiştirilirse, ancak satır/sütun sayısı etkilenmezse, .Bunun yerine datachanged () sinyali. Bu aynı zamanda tüm görünümün yeniden çizilmesini önlemek için verilerde değiştirilmiş bir bölgeyi sol üst ve sağ alt kiralama kullanarak tanımlar.

Diğer Eylemleri Bağlamak

Artık düğmenin geri kalanını bağlayabilir ve performans için yardım ekleyebiliriz silmek Ve tamamlamak operasyonlar. __İnit__ bloğuna daha önce olduğu gibi düğme sinyallerini ekleriz.

 kendi kendine.addbutton.basmak.Connect (benlik.Ekle).Silebutton.basmak.Connect (benlik.Sil) Benlik.Tamamen Button.basmak.Connect (benlik.Tamamlamak) 

Ardından aşağıdaki gibi yeni bir silme yöntemi tanımlayın –

 Def Delete (self): dizinler = self.Todview.SelectedDindexes () INDEXES: # INDEXES, Single Select'te tek bir öğenin listesidir. İndex = dizinler [0] # Öğeyi kaldır ve yenileyin. Del Self.model.Todos [dizin.Row ()] Benlik.model.layoutchanged.Emit () # Seçimi temizleyin (uzun geçerli olmadığı için). kendi kendine.Todview.ClarSelection () 

Kendini kullanıyoruz.Todview.dizinleri almak için seçilmişDindexes (aslında tek seçim modunda olduğu gibi tek bir öğenin listesi) ve sonra .Row () Modelimizdeki Todos listemize bir dizin olarak. Python’un Del operatörünü kullanarak dizinli öğeyi siliyoruz ve daha sonra verilerin şekli değiştirildiğinden, bir layoutchange sinyalini tetikliyoruz.

Son derece, aktif seçimi temizliyoruz, çünkü Mayıs ayı sınırları dışında (son öğeyi seçmiş olsaydınız).

Bunu akıllı hale getirmeyi deneyebilir ve bunun yerine listedeki son öğeyi seçebilirsiniz

Tam yöntem böyle seviyor –

 Def complete (self): dizinler = self.Todview.SelectredIndexes () IN INDEXES: INDEX = INDEXES [0] ROW = INDEX.Row () durumu, metin = benlik.model.Todos [Row] Benlik.model.Todos [satır] = (true, metin) # .Datachanged, tek bir seçim için eşit olan sol üst ve sağ alt alır. kendi kendine.model.dataceged.Emit (dizin, dizin) # Seçimi temizleyin (uzun geçerli olmadığı için). kendi kendine.Todview.ClarSelection () 

Bu, silme ile aynı dizinlemeyi kullanır, ancak bu sefer öğeyi modelden getiririz .Todos listesi ve ardından durumu doğrula değiştirin .

Verilerimiz, değiştirilemeyen Python Tuples olarak saklandığı için bu getir ve değiştirmeyi yapmalıyız.

Burada farklı anahtar vs. Standart QT widget’ları, doğrudan verilerimize göre değişim yapmamız ve QT’ye Haasurd’u değiştirdiğini basitçe bilgilendirmemiz gerektiğidir – widget durumunun güncellenmesi otomatik olarak işlenir.

Qt kullanma.Dekorasyonel

Uygulamayı şimdi çalıştırırsanız, her iki çalışmayı eklemenin ve silmeyi bulmalısınız, ancak öğeleri tamamlarken çalışırken, görünümde bunun bir göstergesi yok. Bir öğe tamamlandığında görüntülenecek bir gösterge sağlamak için modelimizi güncellememiz gerekiyor. Güncellenmiş model aşağıda gösterilmiştir.

kene = qtgui.Qimage ('kene.png ') sınıf todomodel (qtcore.QabstractListModel): def __init __ (benlik, *args, todos = none, ** kwargs): süper (todomodel, self).__init __ (*args, ** kwargs) benlik.Todos = Todos veya [] DEF verileri (self, dizin, rol): Rol == Qt ise.DisplayRole: _, metin = self.Todos [dizin.ROW ()] ROL == QT ise metni döndür.DecorationRole: Durum, _ = Benlik.Todos [dizin.Row ()] Durum: Dönüş Tick Def RowCount (Self, Dizin): Len (Self Return (Self.Todos) 

Bir kene simgesi kene kullanıyordu.Tick ​​adlı bir Qimage nesnesine yüklediğimiz eksiksiz öğeleri belirtmek için PNG . Modelde QT için bir işleyici uyguladık.Durumu olan satırlar için kene simgesini döndüren DecorationRole doğrudur (tam için).

Kullandığım simge, P tarafından ayarlanan fugue’den alındı.Yusukamiyamane

Bir i simgesinin intostad, ayrıca renklere de dönebilirsiniz, e.G. Qtgui.Katı kare olarak çizilecek olan QColor (‘yeşil’).

Uygulamayı çalıştırıyorum Artık öğeleri tam olarak işaretleyebilmelisiniz.

Todos tam olarak işaretlendi

Todos tam olarak işaretlendi

Kalıcı bir veri deposu

Todo uygulamamız güzel çalışıyor, ancak ölümcül bir kusuru var-Todos’larınızı, Zen’in kısa vadeli duygularına katkıda bulunabileceğiniz zaman yapmanız gereken hiçbir şeyin olmadığını düşünürken uygulamayı kapatırınızı unutuyor, uzun vadeli bir kötü bir fikir.

Çözüm, kalıcı veri deposunun bazı gezilerini uygulamaktır. En basit yaklaşım, başlangıçta bir JSON veya turşu dosyasından öğeleri yüklediğimiz ve değişikliğe geri yazdığımız basit bir dosya mağazasıdır.

Bunu yapmak için elimizde iki yeni yöntem tanımlıyoruz . Bu bir JSON dosya adı verilerinden verileri yükleyin.JSON (eğer varsa, eğer değilse hatayı görmezden geliyor).model.Todos ve mevcut benliği yaz.model.Sırasıyla aynı dosyaya çıkın.

 Def yük (self): deneyin: açık ('veriler.json ',' r ') f: benlik.model.Todos = JSON.LOUL (F) İstisna İstisna: Pass def kaydet (self): açık ('veriler.Json ',' w ') f: data = json.Dökme (Benlik.model.Todos, f) 

Verilerdeki değişiklikleri devam ettirmek için eklememiz gereken .Kaydet () işleyicisi, verileri değiştiren herhangi bir yöntemin sonuna kadar ve .Model oluşturduktan sonra __init__ bloğuna yük () işleyicisi.

Son kod şu gibi görünüyor –

İçe Aktarma Sys İçe Aktarma JSON'dan PYQT5'ten qtcore, QtGui, Qtwidgets, UIC PYQT5'ten.Qtcore ithalat qt_creator_file = "mainwindow.ui "ui_mainwindow, qtbaseclass = UIC.LoadUduseype (qt_creator_file) kene = qtgui.Qimage ('kene.png ') sınıf todomodel (qtcore.QabstractListModel): def __init __ (benlik, *args, todos = none, ** kwargs): süper (todomodel, self).__init __ (*args, ** kwargs) benlik.Todos = Todos veya [] DEF verileri (self, dizin, rol): Rol == Qt ise.DisplayRole: _, metin = self.Todos [dizin.ROW ()] ROL == QT ise metni döndür.DecorationRole: Durum, _ = Benlik.Todos [dizin.Row ()] Durum: Dönüş Tick Def RowCount (Self, Dizin): Len (Self Return (Self.Todos) Sınıf Mainwindow (Qtwidgets.Qmainwindow, UI_MainWindow): Def __init __ (Self): Süper (Mainwindow, Self).__Kendi içinde.Setupui (benlik) benlik.Model = ToDomodel () Benlik.Yük () benlik.Todview.Setmodel (benlik.Model).addbutton.basmak.Connect (benlik.Ekle).Silebutton.basmak.Connect (benlik.Sil) Benlik.Tamamen Button.basmak.Connect (benlik.Complete) def ADD (self): "" "Todo listemize bir öğe ekleyin, metni QLineLedit'ten alın .Todoedit ve orada temizleme. "" "metin = self.Tododit.Text () Metin: # boş dizeler eklemeyin. # Model üzerinden listeye erişin. kendi kendine.model.todos.Append ((yanlış, metin)) # Tetikleyici Yenileme. kendi kendine.model.layoutchanged.Emit () # giriş benliğini boşaltın.Tododit.Settext ("") benlik.Save () def delete (self): dizinler = self.Todview.SelectedDindexes () INDEXES: # INDEXES, Single Select'te tek bir öğenin listesidir. İndex = dizinler [0] # Öğeyi kaldır ve yenileyin. Del Self.model.Todos [dizin.Row ()] Benlik.model.layoutchanged.Emit () # Seçimi temizleyin (uzun geçerli olmadığı için). kendi kendine.Todview.ClarSelection () Benlik.Save () def complete (self): dizinler = self.Todview.SelectredIndexes () IN INDEXES: INDEX = INDEXES [0] ROW = INDEX.Row () durumu, metin = benlik.model.Todos [Row] Benlik.model.Todos [satır] = (true, metin) # .Datachanged, tek bir seçim için eşit olan sol üst ve sağ alt alır. kendi kendine.model.dataceged.Emit (dizin, dizin) # Seçimi temizleyin (uzun geçerli olmadığı için). kendi kendine.Todview.ClarSelection () Benlik.Save () def yük (self): deneyin: '.db ',' r ') f: benlik.model.Todos = JSON.LOUL (F) İstisna İstisna: Pass def kaydet (self): açık ('veriler.db ',' w ') f: data = json.Dökme (Benlik.model.Todos, F) App = Qtwidgets.Qapplication (Sys.Argv) pencere = mainwindow () penceresi.Show () uygulaması.Exec_ () 

Uygulamanızdaki verilerin büyük veya daha karmaşık olma potansiyeline sahipse, saklamak için gerçek bir veritabanı kullanmayı önleyebilirsiniz. Bu durumda model, arayüzü veritabanına sarar ve verilerin görüntülenmesi için doğrudan sorgular. Bunu yaklaşan bir öğreticide nasıl yapacağımı kapsayacak.

Bir QListView’in başka bir ilginç örneği için bu örnek medya oynatıcı uygulamasına bakın. QT binası QmediaPlaylist’i veri deposu olarak kullanır ve içerikler bir QListView’da görüntülenir .

BCR Hakkında.CX:

BCR.CX, hem iş dış kaynak kullanımı süreçleri (BPO) hem de iş ortamı dış kaynak kullanımı (BEO) konusunda uzmanlaşmış, esas olarak talep üretimi, müşteri deneyimi, iletişim, kullanıcı desteği ve memnuniyetine odaklanan bir Brezilya teknoloji girişimidir.

Tanım:

Todo uygulaması, iş günlerinde acentenin notlarını saklamak için hızlı, güvenli ve kullanıcı dostu bir yol olarak geliştirildi.

Her bir bilet veya müşteriye göre kendi görevlerinizi oluşturabilir ve yönetebilir.

Patika oluşturun ve iş akışınızı özelleştirin

Verimlilik arttırır! Todo uygulamasını kullanarak, tekrarlayan süreçleri standartlaştırmak için özelleştirilmiş iş akışları oluşturabilirsiniz. Şimdi deneyin ve todos ve bağışlarınız olarak ilerlemenizi kontrol etmeye başlayın.

Kaynaklar:

  1. Her bilet için görevler oluşturun
  2. İlerleme çubuğu teslim edilebilir takip etmek için
  3. Verimliliği artırmak için standart iş akışları oluşturun.
  4. Günlük rutininize devam etmek için görev listenizi yönetin.
  1. Uygulama özellikleri üzerinden tam erişim elde etmek için hem Todo hem de Zendesk Sunshine’ı istifleyin
  2. Görev otomasyonları oluşturarak veya düzenleyerek verimliliği artırın ve kişiselleştirilmiş ön ayarlarınızı kaydedin.