TODO di Mac App Store, menggunakan arsitektur PYQT5 ModelView untuk membangun aplikasi TODO yang sederhana

Antarmuka ModelView Architecture QT S MVC untuk menampilkan data dalam tampilan

Aplikasi berjalan ditampilkan di bawah.

Todo 4+

Selama beberapa tahun saya menggunakan aplikasi ini di iPad saya, iPhone saya dan MacBookPro saya. Jika terus bekerja dengan sempurna di iOS, tampaknya itu belum sepenuhnya mengikuti evolusi macOS.
Tidak ada masalah menginstalnya. Tetapi tidak mungkin lagi menyinkronkan dengan TOODLEDO pada macOS, sementara itu terus dimungkinkan di iOS: pengidentifikasi yang sama tidak dikenali.
Karena itu menjadi tidak perlu bagi saya … dan bantuan Appigo tampaknya tidak terburu -buru untuk memberikan jawaban atas permintaan saya. Selalu tidak menyenangkan untuk dicatat bahwa konsep pelanggan kehilangan sedikit lebih banyak nilainya setiap hari.

Pisa d

Sejak pembaruan ini saya telah kehilangan semua daftar saya di jumlah 12 dan dengan mana saya bekerja setiap hari dengan cara yang profesional. Saya mengelola sekitar 200 tempat secara permanen, pembaruan ini telah terjadi pada bulan -bulan cobaan berat ! Semua tugas yang diselenggarakan dalam daftar menemukan diri mereka dikelompokkan dalam satu daftar global. Tentunya bukan bug ini yang akan membuat saya lulus ke versi yang mengatakan profesional perangkat lunak ini sebaliknya. Saya tidak akan pernah menjadi tawanan. Hanya bagi saya untuk menunggu tanggapan dukungan yang dihubungi malam ini melalui email atau kemudian temukan versi lama dari perangkat lunak yang luar biasa ini. Saya sangat berharap bahwa ini adalah beug muda dari versi baru dan bukan strategi untuk memaksa untuk bermigrasi ke versi pro berbayar untuk menemukan fungsionalitas yang sudah diperoleh dengan versi sebelumnya. Untuk info sinkronisasi saya selesai dengan dropbox

SurlePoint, 12/13/2011

Synchro sekarang nikel

Saya meraih sebelum sinkronisasi yang lambat, berjalan dengan buruk, dll. Tapi sekarang dengan iCloud, itu sangat cocok untuk saya.

Beberapa kemungkinan perbaikan: lebih banyak pengaturan tampilan.
– untuk hanya menampilkan apa yang digunakan pengguna. Misalnya saya tidak menggunakan konteks atau label (dalam hal apa pun belum) dan saya ingin tidak lagi menampilkan opsi -opsi ini yang “mencemari” TODO saya. Saya ingin hanya memiliki “tanggal / prioritas / daftar / ketik” untuk catatan sehari -hari saya dan klik kanan untuk opsi yang jarang saya gunakan
– Dan sebaliknya saya ingin tampilan PLSU sederhana daripada menu drop -down untuk memilih tanggal, prioritas, daftar, … jika saya hanya memiliki tiga daftar, maka tiga tombol akan cukup untuk ditampilkan, dan saya dapat memilih daftar saya Dengan satu klik alih -alih mengklik pada menu drop -down, temukan namanya, dan klik di atasnya. (Ditto untuk prioritas, terutama yang kita beralih dari gambar yang sangat visual pada daftar TODO ke pilihan nama dalam opsi yang tidak terlalu alami.

Ini adalah detail ergonomi. Saya suka kesederhanaan dan efisiensi todo, jadi saya ingin itu bisa lebih dapat dikonfigurasi agar lebih sederhana.

Aplikasi Privasi

Pengembang, Appigo, belum memberikan perincian tentang praktik pribadinya dan penanganan data ke Apple. Untuk informasi lebih lanjut, lihat Kebijakan Privasi Pengembangan.

Arsitektur ModelView
Antarmuka seperti MVC QT untuk menampilkan data dalam tampilan

Saat Anda mulai membangun aplikasi yang lebih kompleks dengan PYQT5, kemungkinan besar akan menjaga widget tetap sinkron dengan data Anda. Data yang disimpan dalam widget (e.G. QlistWidget sederhana) tidak tersedia untuk dimanipulasi dari python – perubahan mengharuskan Anda mendapatkan item, mendapatkan data, dan kemudian mengaturnya kembali. Solusi default untuk ini adalah untuk menjaga representasi data eksternal di Python, dan kemudian eith menduplikasi pembaruan ke data dan widget, atau cukup menulis ulang widget wihole dari data. Ini bisa menjadi jelek dengan cepat, dan menghasilkan banyak boilerplate hanya untuk mengutak -atik data.

Untungnya QT memiliki solusi untuk ini – ModelViews. ModelViews adalah alternatif yang kuat untuk widget tampilan standar, yang menggunakan antarmuka model reguler untuk berinteraksi dengan sumber data – dari struktur data sederhana hingga database eksternal. Ini mengisolasi data Anda, memungkinkannya disimpan dalam struktur apa pun yang Anda sukai, sementara tampilan menangani presentasi dan pembaruan.

Tutorial ini memperkenalkan aspek -aspek kunci dari Arsitektur ModelView QT dan menggunakannya untuk membangun aplikasi Todo Desktop Sederhana di PYQT5.

Pengontrol tampilan model

Model – Lihat – Pengontrol (MVC) adalah penggunaan pola arsitektural untuk antarmuka pengguna pengembangan yang membagi aplikasi menjadi tiga bagian yang saling berhubungan. Ini memisahkan representasi internal data dari bagaimana informasi disajikan dan menerima dari pengguna.

MVC Design Pattenn Fets Tiga Komponen Utama –

  • Model Memegang struktur data yang bekerja dengan aplikasi.
  • Melihat Apakah representasi informasi seperti yang ditunjukkan kepada pengguna, di mana grafis atau tabel. Beberapa tampilan model data yang sama diperbolehkan.
  • Kontrol Menerima input dari pengguna, mengubahnya menjadi perintah menjadi model atau tampilan.

Qt mendaratkan perbedaan antara pandangan & pengontrol menjadi sedikit keruh. QT menerima acara input dari pengguna (melalui OS) dan mendelegasikannya ke widget (pengontrol) untuk menangani. Namun, widget juga menangani presentasi keadaan saat ini kepada pengguna, menempatkan mereka tepat di tampilan. Alih-alih menderita di mana untuk menggambar garis, dalam qt-speak tampilan dan pengontrol adalah iLead yang digabungkan togd menampung model/view controller yang disebut “tampilan model” untuk kesederhanaan demi kesederhanaan.

Yang penting, perbedaan antara data Dan Bagaimana itu disajikan dilestarikan.

Tampilan model

Model bertindak sebagai antarmuka antara penyimpanan data dan viewController. Model ini menyimpan data (atau referensi untuk itu) dan menyajikan data ini melalui API standar yang dilihat kemudian dikonsumsi dan disampaikan kepada pengguna. Beberapa tampilan dapat berbagi data yang sama, menyajikannya dengan cara yang sama sekali berbeda.

Anda dapat menggunakan “penyimpanan data” apa pun untuk model Anda, termasuk misalnya daftar python standar atau kamus, atau database (melalui E.G. SQLALCHEMY) – Terserah Anda.

Kedua bagian pada dasarnya bertanggung jawab untuk –

  1. teh model Menyimpan data, atau referensi ke sana dan mengembalikan rentang catatan individu, dan metadata terkait atau menampilkan instruksi.
  2. teh melihat Meminta data dari model dan menampilkan apa yang dikembalikan pada widget.

Ada diskusi mendalam tentang arsitektur QT dalam dokumentasi.

Panduan Lengkap untuk Pengemasan Aplikasi Python GUI dengan PyInstaller.

Pengemasan Aplikasi Python dengan PyInstaller

[[diskon.Diskon_pc]]]% devion untuk [diskon berikutnya.durasi]] [diskon.Deskripsi]] dengan kode [diskon.Kode Kupon]]

Paritas Daya Pembelian

Pengembang di [[negara]] dapatkan [[diskon.diskon_pc]]] mati di semua buku & kursus dengan kode [diskon.Kode Kupon]]

Tampilan Model Sederhana – Daftar Todo

Untuk menunjukkan cara menggunakan ModelViews dalam praktiknya, kami akan mengumpulkan implementasi yang sangat sederhana dari daftar todo desktop. Ini akan terdiri dari qlistView untuk daftar item, qlineDit untuk memasukkan item baru, dan satu set tombol untuk menambah, menghapus, atau menandai item seperti yang dilakukan.

UI

UI sederhana adalah pencipta QT yang jelek dan disimpan sebagai Mainwindow.Ui . teh .file UI dan semua bagian lainnya dapat diunduh di bawah ini.

Mendesain aplikasi TODO sederhana di QT Creator

Mendesain aplikasi TODO sederhana di QT Creator

Aplikasi berjalan ditampilkan di bawah.

The Running Todo GUI (belum ada yang berfungsi)

The Running Todo GUI (belum ada yang berfungsi)

Widget yang tersedia di antarmuka yang kami berikan ID yang ditunjukkan pada tabel di bawah ini.

objeuch Baik Keterangan
Todview QListView Daftar Todos saat ini
Tododit QlineEdit Input teks untuk membuat item TODO baru
addbutton Qpushbutton Buat todo baru, tambahkan ke daftar Todos
deleteButton Qpushbutton Hapus TODO yang dipilih saat ini, menghapusnya dari daftar Todos
Lengkap Butir Qpushbutton Tandai todo yang dipilih saat ini seperti yang dilakukan

Kami akan menggunakan pengidentifikasi ini untuk menghubungkan logika aplikasi nanti.

Model

Kami mendefinisikan model kustom kami dengan subklassing dari implementasi, memungkinkan kami untuk fokus pada bagian yang unik untuk model kami. QT menyediakan sejumlah basis model yang berbeda, termasuk daftar, pohon dan tabel (ideal untuk spreadsheet).

Untuk contoh ini kami menampilkan hasilnya ke qlistview . Model dasar yang cocok untuk ini adalah qabstractlistmodel . Definisi garis besar untuk model kami ditunjukkan di bawah ini.

Kelas TODODOMODEL (QTCORE.QABSTRACTLISTMODEL): DEF __init __ (self, *args, todos = tidak ada, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.Todos = Todos atau [] Def Data (Self, Index, Role): Jika Peran == Qt.DisplayRole: # Lihat di bawah untuk struktur data. status, teks = diri sendiri.Todos [indeks.Row ()] # kembalikan teks todo saja. Return text def rowcount (self, index): return len (self.Todos) 

teh .Variabel Todos adalah penyimpanan data kami dan dua metode rowcount () dan data () adalah metode model standar yang harus kami lakukan untuk model daftar. Kami akan membahasnya secara bergantian di bawah ini.

.Daftar Todos

Penyimpanan data untuk model kami adalah .Todos, daftar python sederhana di mana kami akan menyimpan tuple nilai dalam format [(bool, str), (bool, str), (bool, str)] di mana bool adalah Karena itu keadaan entri yang diberikan, dan STR adalah teks todo.

Kami menginisialisasi diri.ToDo ke ​​daftar kosong saat startup, kecuali daftar disahkan melalui argumen kata kunci Todos.

diri sendiri.todos = todos atau [] akan mengatur diri sendiri.todos ke nilai todos yang disediakan jika itu Truty (Saya.e. Apa pun selain daftar kosong, boolean false atau tidak ada nilai default), jika tidak, itu akan diatur ke daftar kosong [] .

Untuk membuat perselisihan dari model ini, kita bisa sederhana –

Model = toDomodel () # Buat daftar TODO yang kosong 

Atau lulus dalam daftar yang ada –

todos = [(false, 'sebuah item'), (false, 'item lain')] model = toDomodel (todos) 

.Rowcount ()

teh .Metode RowCount () adalah Callade dengan tampilan untuk mendapatkan jumlah baris dalam data saat ini. Ini diperlukan untuk tampilan hingga sekarang indeks maksimum yang dapat mengulang penyimpanan data (hitungan baris-1). Penjualan Kami menggunakan daftar python sebagai penyimpanan data kami, nilai pengembalian untuk ini hanyalah len () dari daftar.

.Data ()

Ini adalah inti dari model Anda, yang menangani permintaan data dari tampilan dan mengembalikan hasil yang sesuai. Itu menerima dua indeks parameter dan peran.

Indeks adalah posisi/koordinat data yang diminta tampilan, dapat diakses dengan dua metode .Baris () dan .kolom () yang memberikan posisi di setiap dimensi.

Untuk qlistView kami kolom selalu 0 dan dapat diabaikan, tetapi Anda perlu menggunakan ini untuk data 2D dalam tampilan spreadsheet.

Peran adalah bendera yang menunjukkan baik data yang diminta tampilan. Ini karena .Metode data () sebenarnya memiliki lebih banyak tanggung jawab daripada sekadar data inti. Ini juga menangani permintaan informasi gaya, tooltip, bilah status, dll. – Basalely apa pun yang dapat diinformasikan oleh data itu sendiri.

Penamaan QT.DisplayRole agak aneh, tetapi ini menunjukkan bahwa melihat sedang bertanya kepada kami “tolong beri saya data untuk tampilan”. Ada yang lain peran Yang dapat diterima data untuk permintaan styling atau meminta data dalam format “Edit-Ready”.

Peran Nilai Keterangan
Qt.Menampilkan 0 Data kunci yang akan dijatuhkan dalam bentuk teks. (Qstring)
Qt.Dekorasi 1 Data yang akan diterjemahkan sebagai dekorasi dalam bentuk ikon. (QColor, Qicon atau Qpixmap)
Qt.Tajuk rencana 2 Data dalam ikuti formal untuk diedit di editor. (Qstring)
Qt.Tooltiprole 3 Data yang ditampilkan di tooltip item. (Qstring)
Qt.Statustiprole 4 Data yang ditampilkan di bilah status. (Qstring)
Qt.Whatsthisrole 5 Data yang ditampilkan untuk item di “apa ini?” mode. (Qstring)
Qt.SizeHintole 13 Petunjuk ukuran untuk item yang akan dipasok ke tampilan. (QSIZE)

Untuk daftar lengkap tersedia peran yang dapat Anda terima, lihat dokumentasi QT Itmdatarole. Daftar TODO kami hanya akan menggunakan QT.DisplayRole dan Qt.Dekorasi .

Implementasi Dasar

Di bawah ini adalah aplikasi rintisan dasar yang diperlukan untuk memuat UI dan menampilkannya. Kami akan menambahkan kode model dan logika aplikasi kami ke basis ini.

Impor sys dari pyqt5 impor qtcore, qtgui, qtwidgets, uic dari pyqt5.Qtcore impor qt_creator_file = "MainWindow.ui "ui_mainwindow, qtbaseclass = uic.LoadUduype (qt_creator_file) kelas TODOMODEL (qtcore.QABSTRACTLISTMODEL): DEF __init __ (self, *args, todos = tidak ada, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.Todos = Todos atau [] Def Data (Self, Index, Role): Jika Peran == Qt.DisplayRole: Status, Teks = Self.Todos [indeks.Row ()] return text def rowcount (self, index): return len (self.Todos) kelas MainWindow (qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (diri) diri.Setupui (self) self.Model = toDomodel () self.Todview.SetModel (self.Model) app = qtwidgets.Qapplication (Sys.Window argv) window = MainWindow ().Tampilkan () Aplikasi.Exec_ () 

Kami mendefinisikan TODODOMODEL kami seperti sebelumnya, dan menginisialisasi objek MainWindow. Di __init__ untuk MainWindow kami membuat contoh model TODO kami dan mengatur model ini di TODO_VIEW . Simpan file ini sebagai TODO.Py dan jalankan dengan –

TODO PYTHON3.laju 

Meskipun belum banyak yang bisa dilihat, qlistView dan model kami sebenarnya berfungsi – jika Anda menambahkan beberapa data default, Anda akan melihatnya muncul dalam daftar.

diri sendiri.model = toDomodel (todos = [(false, 'my first todo')]))) 

Qlistview yang menunjukkan item todo berkode keras

Qlistview yang menunjukkan item todo berkode keras

Anda dapat terus menambahkan item secara manual seperti ini dan mereka akan muncul secara berurutan di QListView . Selanjutnya kita akan memungkinkan untuk menambahkan ITM dari dalam aplikasi.

Pertama -tama buat metode baru di MainWindow bernama Add . Ini adalah panggilan balik kami yang akan mengurus menambahkan teks saat ini dari input sebagai todo baru. Hubungkan metode ini ke addbutton.Sinyal ditekan di ujung blok __init__.

Kelas MainWindow (QTWidgets.Qmainwindow, ui_mainwindow): def __init __ (self): qtwidgets.Qumainwindow.__init __ (self) ui_mainwindow.__init __ (diri) diri.Setupui (self) self.Model = toDomodel () self.Todview.SetModel (self.Model) # Sambungkan tombol. diri sendiri.addbutton.tekan.Terhubung (diri.Tambahkan) def add (self): "" Tambahkan item ke daftar TODO kami, mendapatkan teks dari qlineedit .TODOEDIT dan di sana membersihkannya. "" "Teks = diri.Tododit.Text () jika teks: # jangan tambahkan string kosong. # Akses daftar melalui model. diri sendiri.model.Todos.Append ((false, text)) # pemicu penyegaran. diri sendiri.model.tata letak yang berubah.Emit () # kosongkan self input.Tododit.SetText ("") 

Di add block perhatikan self line.model.tata letak yang berubah.Emit () . Di sini kami memancarkan sinyal model .tata letak berubah untuk memberi tahu pandangan bahwa membentuk data telah diubah. Ini memicu penyegaran entitas tampilan. Jika Anda menghilangkan baris ini, todo masih akan ditambahkan tetapi qlistView tidak akan memperbarui.

Jika data saja diubah, tetapi jumlah baris/kolom tidak terpengaruh, Anda dapat menggunakan .Sinyal datachanged () sebagai gantinya. Ini juga mendefinisikan wilayah yang diubah dalam data menggunakan sewa kiri atas dan kanan bawah untuk menghindari menggambar ulang seluruh tampilan tampilan.

Mengaitkan tindakan lainnya

Kami sekarang dapat menghubungkan sinyal tombol lainnya dan menambahkan bantuan untuk kinerja menghapus Dan menyelesaikan operasi. Kami menambahkan sinyal tombol ke blok __init__ seperti sebelumnya.

 diri sendiri.addbutton.tekan.Terhubung (diri.Tambahkan) diri.deleteButton.tekan.Terhubung (diri.Hapus) diri.Lengkap Butir.tekan.Terhubung (diri.Menyelesaikan) 

Kemudian tentukan metode hapus baru sebagai berikut –

 Def hapus (self): indexes = self.Todview.SelectedDIndexes () Jika indeks: # Indeks adalah daftar item tunggal dalam seleksi tunggal. Indeks = indeks [0] # hapus item dan refresh. Del Self.model.Todos [indeks.Row ()] self.model.tata letak yang berubah.Emit () # hapus pilihan (karena tidak lama valid). diri sendiri.Todview.Clarselection () 

Kami menggunakan diri.Todview.SelectedDindexes untuk mendapatkan indeks (sebenarnya daftar satu item, seperti yang kita dalam mode seleksi tunggal) dan kemudian .Row () sebagai indeks ke dalam daftar Todos kami pada model kami. Kami menghapus item yang diindeks menggunakan operator del Python, dan kemudian memicu sinyal tata letak karena bentuk data telah dimodifikasi.

Terakhir, kami menghapus pilihan aktif karena item yang berhubungan dengan sekarang mungkin di luar batas (jika Anda telah memilih item terakhir).

Anda dapat mencoba membuat Smartter ini, dan memilih item terakhir dalam daftar

Metode lengkap seperti ini –

 Def complete (self): indexes = self.Todview.selectredIndexes () jika indeks: indeks = indeks [0] baris = indeks.Row () status, teks = self.model.Todos [baris] diri.model.Todos [baris] = (true, teks) # .Datachanged mengambil kanan atas dan kanan bawah, yang sama # untuk satu pilihan tunggal. diri sendiri.model.Datachanged.Emit (indeks, indeks) # hapus pilihan (karena tidak lama valid). diri sendiri.Todview.Clarselection () 

Ini menggunakan pengindeksan yang sama seperti untuk dihapus, tetapi kali ini kami mengambil item dari model .daftar todos dan kemudian ganti status dengan benar .

Kami harus melakukan pengambilan ini, karena data kami disimpan sebagai tupel Python yang tidak dapat dimodifikasi.

Kuncinya berbeda di sini vs. Widget QT standar adalah bahwa kami melakukan perubahan langsung ke data kami, dan secara sederhana perlu memberi tahu QT bahwa mengubah haasurd – memperbarui status widget ditangani secara otomatis.

Menggunakan qt.Dekorasi

Jika Anda menjalankan aplikasi sekarang, Anda harus menemukan bahwa menambahkan dan menghapus kedua pekerjaan, tetapi saat menyelesaikan item berfungsi, tidak ada indikasi dalam tampilan. Kami perlu memperbarui model kami untuk memberikan tampilan dengan indikator untuk ditampilkan saat item selesai. Model yang diperbarui ditunjukkan di bawah ini.

centang = qtgui.Qimage ('centang.PNG ') TODODOMODEL (QTCORE.QABSTRACTLISTMODEL): DEF __init __ (self, *args, todos = tidak ada, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.Todos = Todos atau [] Def Data (Self, Index, Role): Jika Peran == Qt.DisplayRole: _, Text = Self.Todos [indeks.Row ()] mengembalikan teks jika peran == qt.DecorationRole: Status, _ = self.Todos [indeks.Row ()] jika status: return centang def rowcount (self, index): return len (self.Todos) 

Menggunakan ikon kutu kutu.PNG untuk menunjukkan item lengkap, yang kami muat ke objek qimage bernama Tick . Dalam model kami melibatkan penangan untuk QT.DecorationRole yang mengembalikan ikon kutu untuk baris siapa status itu benar (untuk lengkap).

Ikon yang saya gunakan diambil dari fugue yang ditetapkan oleh p.YusukeKekamiyamane

Intostad dari ikon I Anda juga dapat kembali ke warna, e.G. Qtgui.Qcolor (‘hijau’) yang akan digambar sebagai kuadrat solid.

Menjalankan aplikasi Anda sekarang harus dapat menandai item sebagai lengkap.

Todos ditandai lengkap

Todos ditandai lengkap

Penyimpanan data yang bertahan

Aplikasi TODO kami bekerja dengan baik, tetapi ia memiliki satu cacat yang fatal-lupa todo Anda segera setelah Anda menutup aplikasi sambil berpikir tidak ada hubungannya ketika Anda melakukan mungkin untuk berkontribusi pada perasaan zen jangka pendek, jangka panjang itu mungkin a ide buruk.

Solusinya adalah mengimplementasikan beberapa tamasya penyimpanan data persist. Pendekatan paling sederhana adalah toko file sederhana, di mana kami memuat item dari file json atau acar saat startup, dan menulis kembali perubahan.

Untuk melakukan ini, kami mendefinisikan dua metode baru di tangan kami . Data memuat ini dari data nama file JSON.Json (jika ada, mengabaikan kesalahan jika tidak) untuk diri sendiri.model.Todos dan tulis diri saat ini.model.Todos keluar ke file yang sama, masing -masing.

 Def load (self): coba: dengan buka ('data.json ',' r ') sebagai f: self.model.Todos = json.Load (f) Pengecualian Pengecualian: Pass Def Save (Self): dengan Open ('Data.json ',' w ') sebagai f: data = json.Buang (diri.model.Todos, f) 

Untuk mempertahankan perubahan pada data yang kita butuhkan untuk menambahkan .Save () handler ke akhir metode apa pun yang memodifikasi data, dan .Load () pawang ke blok __init__ setelah model telah membuat.

Kode terakhir terlihat seperti ini –

Impor sys impor json dari pyqt5 impor qtcore, qtgui, qtwidgets, uic dari pyqt5.Qtcore impor qt_creator_file = "MainWindow.ui "ui_mainwindow, qtbaseclass = uic.LoadUdUseype (qt_creator_file) Tick = qtgui.Qimage ('centang.PNG ') TODODOMODEL (QTCORE.QABSTRACTLISTMODEL): DEF __init __ (self, *args, todos = tidak ada, ** kwargs): super (todomodel, self).__init __ (*args, ** kwargs) self.Todos = Todos atau [] Def Data (Self, Index, Role): Jika Peran == Qt.DisplayRole: _, Text = Self.Todos [indeks.Row ()] mengembalikan teks jika peran == qt.DecorationRole: Status, _ = self.Todos [indeks.Row ()] jika status: return centang def rowcount (self, index): return len (self.Todos) kelas MainWindow (qtwidgets.QMainWindow, UI_MainWindow): def __init __ (self): super (Mainwindow, self).__Init __ () diri.Setupui (self) self.Model = toDomodel () self.Muat () diri.Todview.SetModel (self.Model) diri.addbutton.tekan.Terhubung (diri.Tambahkan) diri.deleteButton.tekan.Terhubung (diri.Hapus) diri.Lengkap Butir.tekan.Terhubung (diri.Lengkap) def add (self): "" "Tambahkan item ke daftar TODO kami, mendapatkan teks dari QlineEdit .TODOEDIT dan di sana membersihkannya. "" "Teks = diri.Tododit.Text () jika teks: # jangan tambahkan string kosong. # Akses daftar melalui model. diri sendiri.model.Todos.Append ((false, text)) # pemicu penyegaran. diri sendiri.model.tata letak yang berubah.Emit () # kosongkan self input.Tododit.SetText ("") self.Save () def delete (self): indexes = self.Todview.SelectedDIndexes () Jika indeks: # Indeks adalah daftar item tunggal dalam seleksi tunggal. Indeks = indeks [0] # hapus item dan refresh. Del Self.model.Todos [indeks.Row ()] self.model.tata letak yang berubah.Emit () # hapus pilihan (karena tidak lama valid). diri sendiri.Todview.Clarselection () self.Save () def complete (self): indexes = self.Todview.selectredIndexes () jika indeks: indeks = indeks [0] baris = indeks.Row () status, teks = self.model.Todos [baris] diri.model.Todos [baris] = (true, teks) # .Datachanged mengambil kanan atas dan kanan bawah, yang sama # untuk satu pilihan tunggal. diri sendiri.model.Datachanged.Emit (indeks, indeks) # hapus pilihan (karena tidak lama valid). diri sendiri.Todview.Clarselection () self.Save () def load (self): coba: dengan buka ('data.db ',' r ') sebagai f: self.model.Todos = json.Load (f) Pengecualian Pengecualian: Pass Def Save (Self): dengan Open ('Data.db ',' w ') sebagai f: data = json.Buang (diri.model.todos, f) app = qtwidgets.Qapplication (Sys.Window argv) window = MainWindow ().Tampilkan () Aplikasi.Exec_ () 

Jika data dalam aplikasi Anda memiliki potensi untuk menjadi besar atau lebih kompleks, Anda dapat memilih untuk menggunakan database yang sebenarnya untuk menyimpannya. Dalam hal ini model akan membungkus antarmuka ke database dan meminta secara langsung untuk data untuk ditampilkan. Cover l’ll bagaimana melakukan ini dalam tutorial mendatang.

Untuk contoh menarik lainnya dari qlistview, lihat contoh aplikasi pemutar media ini. Ini menggunakan QT Building QMediapLayList sebagai datastore, dengan tampilan konten ke qlistView .

Tentang bcr.CX:

Bcr.CX adalah startup teknologi Brasil, yang berspesialisasi dalam kedua proses outsourcing bisnis (BPO) dan outsourcing lingkungan bisnis (BEO), terutama berfokus pada pembuatan permintaan, pengalaman pelanggan, komunikasi, dukungan pengguna dan kepuasan.

Keterangan:

Aplikasi Todo dikembangkan sebagai cara yang cepat, aman, dan ramah pengguna untuk menyimpan catatan agen selama hari kerja.

Dapat membuat dan mengelola tugas Anda sendiri, berdasarkan setiap tiket atau pelanggan individu.

Buat jalur dan sesuaikan alur kerja Anda

Peningkatan produktivitas! Menggunakan Aplikasi Todo Anda dapat membuat alur kerja yang disesuaikan untuk menstandarkan proses berulang. Coba sekarang dan mulailah mengendalikan kemajuan Anda, sebagai Todos dan Dones Anda.

Sumber daya:

  1. Buat tugas untuk setiap tiket
  2. Progress Bar untuk menindaklanjuti pengiriman
  3. Buat alur kerja standar untuk meningkatkan produktivitas.
  4. Kelola daftar tugas Anda, agar tetap dengan rutinitas harian Anda.
  1. Tumpukan Todo dan Zendesk Sunshine untuk mendapatkan akses penuh melalui fitur aplikasi
  2. Tingkatkan produktivitas dengan membuat atau mengedit otomatisasi tugas, dan simpan preset pribadi Anda.