Qt QML Model, View & Delegate

Pada tulisan ini saya hanya akan berbagi kode sumber Qt Quick pertama. Ini adalah intro ke pemrograman model view dengan QML. Sebelumnya sudah saya posting model view untuk Qt C++.

Contoh proyek ini adalah Qt Quick UI, jika anda membuat New Project di Qt Creator. File kode sumber dibagi menjadi 3, ditambah satu file “Kepala” yang opsional.

Utama.qml

Ini adalah file utama yang dieksekusi dengan qmlscene. Continue reading Qt QML Model, View & Delegate

Advertisements

Pemrograman Model/View dalam Qt (Terjemahan)

Mulai pada tulisan ini, saya coba menerjemahkan dokumentasi dalam Qt Creator tentang Model/View Programming. Saya tidak begitu menangkap maksud dari dokumentasi itu dalam bahasa Inggris. Jadi, dengan bekal Google Translate dan bismillah, sedikit demi sedikit semoga bisa paham pada akhirnya.

Pengantar Model/View Programming

Qt memuat seperangkat kelas item view yang menggunakan arsitektur model/view untuk mengelola hubungan antara data dan caranya disajikan kepada pengguna. Pemisahan fungsionalitas yang diperkenalkan oleh arsitektur ini memberikan fleksibilitas yang lebih besar pada pengembang untuk menyesuaikan presentasi dari item, dan menyediakan antarmuka model standar untuk memungkinkan berbagai sumber data agar bisa digunakan dengan penggambaran item yang ada. Dalam dokumen ini, kami memberikan pengenalan singkat paradigma model / view, menguraikan konsep yang bersangkutan, dan menjelaskan arsitektur sistem penggambaran item. Masing-masing komponen dalam arsitektur dijelaskan, dan contoh diberikan untuk menunjukkan bagaimana menggunakan kelas yang tersedia.

Arsitektur model / view

Model-View-Controller (MVC) adalah pola desain yang berasal dari Smalltalk yang sering digunakan ketika membangun antarmuka pengguna. Dalam Design Patterns, Gamma dkk. menulis:

MVC terdiri dari tiga macam objek. Model adalah objek aplikasinya, View adalah presentasi layarnya, dan Controller mendefinisikan cara user interface bereaksi terhadap input pengguna. Sebelum MVC, pengguna desain antarmuka cenderung mengumpulkan obyek ini bersama-sama. MVC memisahkan mereka untuk meningkatkan fleksibilitas dan penggunaannya kembali.

Jika objek penggambaran dan pengendali digabungkan, hasilnya adalah arsitektur model / view. Ini masih memisahkan cara data itu disimpan dari cara penyajian kepada pengguna, tetapi memberikan kerangka lebih sederhana berdasarkan prinsip-prinsip yang sama. Pemisahan ini memungkinkan untuk menampilkan data yang sama dalam beberapa penggambaran yang berbeda, dan menerapkan jenis penggambaran baru, tanpa mengubah struktur data yang mendasarinya. Untuk memungkinkan penanganan input pengguna yang fleksibel, kami memperkenalkan konsep delegasi. Keuntungan memiliki delegasi dalam kerangka ini adalah bahwa dia memungkinkan untuk kustomisasi cara item data digambarkan dan diedit.

Arsitektur model / view
model-view-controller qtModel berkomunikasi dengan sumber data, menyediakan sebuah antarmuka untuk komponen lain dalam arsitektur. Sifat komunikasi tergantung pada jenis sumber data, dan cara model diimplementasikan.

View memperoleh indeks model dari model itu; ini adalah referensi untuk item-item dari data. Dengan menyediakan indeks model untuk model, view bisa mendapat detail item data dari sumber data.

Dalam view yang standar, delegasi menggambar item data. Bila item diedit, delegasi berkomunikasi dengan model secara langsung dengan menggunakan indeks model.

Secara umum, kelas model / view dapat dipisahkan menjadi tiga kelompok yang dijelaskan di atas: model, view, dan delegasi. Masing-masing komponen ini didefinisikan oleh kelas abstrak yang menyediakan antarmuka umum dan, dalam beberapa kasus, implementasi default dari fitur-fitur. Kelas abstrak dimaksudkan agar bisa diturunkan dalam rangka memberikan kelengkapan fungsi yang diharapkan oleh komponen lainnya; ini juga memungkinkan komponen khusus bisa ditulis.

Model, view, dan delegasi berkomunikasi satu sama lain menggunakan sinyal dan slot:

  1. Sinyal dari model memberi tahu view tentang perubahan pada data yang dimiliki oleh sumber data.
  2. Sinyal dari view memberikan informasi tentang interaksi pengguna dengan item yang ditampilkan.
  3. Sinyal dari delegasi digunakan selama mengedit untuk memberitahu model dan view tentang keadaan editor.

Model

Semua model-model item berdasarkan pada kelas QAbstractItemModel. Kelas ini mendefinisikan sebuah antarmuka yang digunakan oleh view dan delegasi untuk mengakses data. Data itu sendiri tidak harus disimpan dalam model; dapat disimpan dalam struktur data atau repositori yang disediakan oleh kelas terpisah, file, database, atau komponen aplikasi lainnya.

Konsep dasar mengenai model disajikan pada bagian Kelas Model. (Pada tulisan yang akan datang)

QAbstractItemModel menyediakan antarmuka data yang cukup fleksibel untuk menangani view yang mewakili data dalam bentuk tabel, daftar, dan pohon. Namun, ketika menerapkan model baru untuk daftar dan struktur data sejenis tabel, kelas QAbstractListModel dan QAbstractTableModel merupakan titik awal yang lebih baik karena mereka menyediakan implementasi standar sesuai dengan fungsi umum. Masing-masing dari kelas-kelas ini dapat diturunkan untuk menyediakan model yang mendukung jenis khusus dari daftar dan tabel.

Proses menurunkan kelas model dibahas pada bagian Membuat Model Baru.

Qt menyediakan beberapa model siap pakai yang dapat digunakan untuk menangani item data:

  1. QStringListModel digunakan untuk menyimpan daftar sederhana item QString.
  2. QStandardItemModel mengelola struktur pohon yang lebih kompleks dari item, masing-masing dapat berisi data yang berubah-ubah.
  3. QFileSystemModel menyediakan informasi tentang file dan direktori dalam sistem berkas-berkas lokal.
  4. QSqlQueryModel, QSqlTableModel, dan QSqlRelationalTableModel digunakan untuk mengakses database dengan menggunakan kaidah model / view.

Jika model-model standar tidak memenuhi kebutuhan Anda, Anda dapat menurunkan QAbstractItemModel, QAbstractListModel, atau QAbstractTableModel untuk menciptakan model kustom Anda sendiri.

Views

Implementasi lengkap disediakan untuk berbagai jenis tampilan: QListView menampilkan daftar item, QTableView menampilkan data dari model dalam sebuah tabel, dan QTreeView menunjukkan item-item model data dalam daftar hirarkis. Masing-masing kelas ini berdasarkan pada kelas dasar abstrak QAbstractItemView. Meskipun kelas-kelas ini adalah implementasi yang siap pakai, mereka juga dapat diturunkan untuk memberikan view yang disesuaikan.

View yang tersedia diusut pada bagian View Classes.

Delegasi

QAbstractItemDelegate adalah kelas dasar abstrak untuk delegasi dalam kerangka model / view. Implementasi delegasi default disediakan oleh QStyledItemDelegate, dan ini digunakan sebagai delegasi default dengan view standar Qt. Namun, QStyledItemDelegate dan QItemDelegate alternatif independen untuk pelukisan dan menyediakan editor untuk item dalam view. Perbedaan antara mereka adalah bahwa QStyledItemDelegate menggunakan gaya yang sekarang untuk melukis itemnya. Oleh karena itu kami merekomendasikan menggunakan QStyledItemDelegate sebagai kelas dasar ketika mengimplementasikan delegasi kustom atau ketika bekerja dengan stylesheet Qt.

Delegasi dijelaskan pada bagian Kelas-kelas Delegasi.

Penyortiran

Ada dua cara untuk mendekati penyortiran dalam arsitektur Model / view; pendekatan mana yang dipilih bergantung pada model yang mendasarinya.

Jika model Anda bisa diurutkan, yaitu jika ia menggunakan kembali fungsi QAbstractItemModel::sort(), baik QTableView maupun QTreeView menyediakan API yang memungkinkan Anda untuk mengurutkan data model secara terprogram. Selain itu, Anda dapat mengaktifkan pernyortiran interaktif (yaitu memungkinkan pengguna untuk menyortir data dengan mengklik header dari view), dengan menghubungkan sinyal QHeaderView::sortIndicatorChanged() ke slot QTableView::sortByColumn() atau slot QTreeView::sortByColumn(), masing-masing.

Pendekatan alternatif, jika model Anda tidak memiliki antarmuka yang diperlukan atau jika Anda ingin menggunakan tampilan daftar untuk menyajikan data Anda, adalah dengan menggunakan model proxy untuk mengubah struktur model Anda sebelum menyajikan data dalam view. Hal ini dibahas secara rinci pada bagian Proxy Model.

Kelas yang Memudahkan

Sejumlah kelas yang memudahkan berasal dari kelas standar view untuk kepentingan aplikasi yang mengandalkan kelas-kelas item view dan tabel Qt yang berbasis item. Mereka tidak dimaksudkan untuk diturunkan.

Contoh kelas tersebut termasuk QListWidget, QTreeWidget, dan QTableWidget.

Kelas-kelas ini kurang fleksibel dibandingkan dengan kelas-kelas view, dan tidak dapat digunakan dengan model yang berubah-ubah. Kami menyarankan agar Anda menggunakan pendekatan model / view untuk menangani data dalam item view kecuali jika Anda sangat membutuhkan seperangkat kelas berbasis item.

Jika Anda ingin memanfaatkan fitur yang disediakan oleh pendekatan model / view sementara masih menggunakan antarmuka berbasis item, pertimbangkan untuk menggunakan kelas view, seperti QListView, QTableView, dan QTreeView dengan QStandardItemModel.