Jawaban singkat
MVC Qt hanya berlaku untuk satu struktur data . Saat berbicara tentang aplikasi MVC, Anda tidak boleh memikirkan QAbstractItemModel
atau QListView
.
Jika Anda menginginkan arsitektur MVC untuk seluruh program Anda, Qt tidak memiliki kerangka kerja model / tampilan yang "besar". Tetapi untuk setiap daftar / pohon data dalam program Anda, Anda dapat menggunakan pendekatan Qt MVC yang memang memiliki pengontrol dalam tampilannya. The Data adalah dalam atau di luar model; ini tergantung pada jenis model yang Anda gunakan (model subclass sendiri: mungkin di dalam model; misalnya QSqlTableModel: di luar (tapi mungkin di-cache di dalam) model). Untuk menyatukan model dan tampilan Anda, gunakan kelas sendiri yang kemudian mengimplementasikan logika bisnis .
Jawaban panjang
Pendekatan dan terminologi model / tampilan Qt:
Qt memberikan tampilan sederhana untuk model mereka. Mereka memiliki pengontrol bawaan: memilih, mengedit, dan memindahkan item adalah sesuatu yang dalam banyak kasus "kontrol" pengontrol. Yaitu, menafsirkan input pengguna (klik dan gerakan mouse) dan memberikan perintah yang sesuai ke model.
Model Qt memang model yang memiliki data dasar. Model abstrak tentu saja tidak menyimpan data, karena Qt tidak tahu bagaimana Anda ingin menyimpannya. Tapi Anda memperluas QAbstractItemModel sesuai kebutuhan Anda dengan menambahkan container data ke subclass dan membuat antarmuka model mengakses data Anda. Jadi sebenarnya, dan saya berasumsi Anda tidak menyukai ini, masalahnya adalah Anda perlu memprogram model, jadi bagaimana data diakses dan dimodifikasi dalam struktur data Anda.
Dalam terminologi MVC, model berisi data dan logika . Di Qt, terserah Anda apakah Anda menyertakan beberapa logika bisnis Anda ke dalam model atau meletakkannya di luar, menjadi "tampilan" sendiri. Bahkan tidak jelas apa yang dimaksud dengan logika: Memilih, mengganti nama, dan memindahkan item? => sudah diimplementasikan. Melakukan perhitungan dengan mereka? => Letakkan di luar atau di dalam subclass model. Menyimpan atau memuat data dari / ke file? => Taruh di dalam subclass model.
Pendapat pribadi saya:
Sangat sulit untuk menyediakan sistem MV (C) yang baik dan umum untuk programmer. Karena dalam banyak kasus modelnya sederhana (misalnya hanya daftar string) Qt juga menyediakan QStringListModel yang siap digunakan. Tetapi jika data Anda lebih kompleks daripada string, terserah Anda bagaimana Anda ingin merepresentasikan data melalui antarmuka model / tampilan Qt. Jika Anda memiliki, misalnya, sebuah struct dengan 3 bidang (katakanlah orang dengan nama, usia dan jenis kelamin) Anda dapat menetapkan 3 bidang ke 3 kolom berbeda atau ke 3 peran berbeda. Saya tidak menyukai kedua pendekatan tersebut.
Saya pikir kerangka model / tampilan Qt hanya berguna ketika Anda ingin menampilkan struktur data sederhana . Ini menjadi sulit untuk ditangani jika data memiliki tipe khusus atau tidak terstruktur dalam pohon atau daftar (misalnya grafik). Dalam kebanyakan kasus, daftar sudah cukup dan bahkan dalam beberapa kasus, model hanya boleh menampung satu entri tunggal. Terutama jika Anda ingin memodelkan satu entri tunggal yang memiliki atribut berbeda (satu contoh dari satu kelas), kerangka kerja model / tampilan Qt bukanlah cara yang tepat untuk memisahkan logika dari antarmuka pengguna.
Singkatnya, saya pikir kerangka kerja model / tampilan Qt berguna jika dan hanya jika data Anda dilihat oleh salah satu widget penampil Qt . Sama sekali tidak berguna jika Anda akan menulis penampil Anda sendiri untuk model yang hanya berisi satu entri, misalnya pengaturan aplikasi Anda, atau jika data Anda bukan jenis yang dapat dicetak.
Bagaimana saya menggunakan model / tampilan Qt dalam aplikasi (lebih besar)?
Saya pernah menulis (dalam tim) sebuah aplikasi yang menggunakan beberapa model Qt untuk mengelola data. Kami memutuskan untuk membuat DataRole
untuk menyimpan data aktual yang memiliki tipe kustom berbeda untuk setiap subclass model yang berbeda. Kami membuat kelas model luar yang disebut Model
memegang semua model Qt yang berbeda. Kami juga membuat kelas tampilan luar yang disebut View
menahan jendela (widget) yang terhubung ke model di dalamnya Model
. Jadi pendekatan ini adalah Qt MVC yang diperluas, disesuaikan dengan kebutuhan kita sendiri. Baik Model
dan View
kelas itu sendiri tidak ada hubungannya dengan Qt MVC.
Dimana kita meletakkan logikanya ? Kami membuat kelas yang melakukan penghitungan aktual pada data dengan membaca data dari model sumber (saat model berubah) dan menulis hasilnya ke dalam model target. Dari sudut pandang Qt, kelas logika ini akan menjadi pandangan, karena mereka "terhubung" ke model (bukan "tampilan" untuk pengguna, tetapi "tampilan" untuk bagian logika bisnis aplikasi).
Dimana pengontrolnya ? Dalam terminologi MVC asli, pengontrol menafsirkan input pengguna (mouse dan keyboard) dan memberikan perintah ke model untuk melakukan tindakan yang diminta. Karena tampilan Qt sudah menafsirkan input pengguna seperti mengganti nama dan memindahkan item, ini tidak diperlukan. Tetapi yang kami butuhkan adalah interpretasi dari interaksi pengguna yang melampaui tampilan Qt.