Коротка відповідь
Qt MVC застосовується лише до однієї структури даних . Коли мова йде про MVC додатки ви не повинні думати про те QAbstractItemModel
чи QListView
.
Якщо ви хочете архітектуру MVC для всієї програми, Qt не має такої "величезної" моделі / структури перегляду. Але для кожного списку / дерева даних у вашій програмі ви можете використовувати підхід Qt MVC, який дійсно має контролер у своєму режимі перегляду. Дані всередині або поза моделлю; це залежить від того, який тип моделі ви використовуєте (власний підклас моделі: ймовірно, в межах моделі; наприклад, QSqlTableModel: зовні (але, можливо, кешований всередині моделі)). Для складання своїх моделей та поглядів використовуйте власні класи, які потім реалізують бізнес-логіку .
Довга відповідь
Модель / підхід Qt / підхід та термінологія:
Qt надає прості види для своїх моделей. У них вбудований контролер : вибір, редагування та переміщення елементів - це те, що в більшості випадків контролер «контролює». Тобто, інтерпретуючи введення користувача (клацання та переміщення миші) та надання відповідних команд моделі.
Моделі Qt - це справді моделі, що мають основні дані. Звичайно, абстрактні моделі не містять даних, оскільки Qt не знає, як їх зберігати. Але ви поширюєте QAb AbstractItemModel на свої потреби, додаючи свої контейнери даних до підкласу та роблячи модельний інтерфейс для доступу до ваших даних. Тож насправді, і я припускаю, що вам це не подобається, проблема полягає в тому, що вам потрібно запрограмувати модель, щоб отримати доступ до даних і змінити їх у структурі даних.
У термінології MVC модель містить і дані, і логіку . У Qt, ви вирішуєте, включите ви чи ні свою бізнес-логіку у свою модель чи поставите її поза, будучи "переглядом" самостійно. Навіть не зрозуміло, що означає логіка: вибір, перейменування та переміщення предметів? => вже реалізовано. Робите розрахунки з ними? => Поставте його зовні або всередині модельного підкласу. Зберігання або завантаження даних з / у файл? => Помістіть його всередині модельного підкласу.
Моя особиста думка:
Надати програмісту хорошу і загальну систему МВ (С) дуже важко . Оскільки в більшості випадків моделі прості (наприклад, лише списки рядків), Qt також забезпечує готовий до використання QStringListModel. Але якщо ваші дані складніші за рядки, то вирішувати, як ви хочете представити дані через інтерфейс моделі Qt / перегляду, залежати від вас. Якщо у вас є, наприклад, структура з 3 полями (скажімо, особами з ім'ям, віком і статтю), ви можете призначити 3 поля для 3 різних стовпців або 3 різних ролей. Мені не подобаються обидва підходи.
Я думаю, що модель / рамка перегляду Qt корисна лише тоді, коли потрібно відображати прості структури даних . Обробляти стає важко, якщо дані мають власні типи або структуровані не у дереві чи списку (наприклад, графік). У більшості випадків списків достатньо, і навіть в деяких випадках модель повинна містити лише один окремий запис. Особливо, якщо ви хочете моделювати один запис із різними атрибутами (один екземпляр одного класу), модель / перегляд Qt не є правильним способом відокремити логіку від користувальницького інтерфейсу.
Підводячи підсумок, я вважаю, що модель / рамка перегляду Qt є корисною лише тоді, коли ваші дані переглядаються одним із віджетів перегляду Qt . Це абсолютно марно, якщо ви збираєтеся написати власного переглядача для моделі, що містить лише один запис, наприклад, налаштування вашої програми або якщо ваші дані не мають типів для друку.
Як я використовував Qt model / view в (більшій) програмі?
Я колись написав (у команді) додаток, який використовує кілька моделей Qt для управління даними. Ми вирішили створити DataRole
для зберігання фактичних даних, які були різного користувальницького типу для кожного підкласу моделі. Ми створили клас зовнішньої моделі під назвою, що Model
містить усі різні моделі Qt. Ми також створили клас зовнішнього вигляду, який називається View
проведення вікон (віджетів), які підключені до моделей всередині Model
. Таким чином, цей підхід є розширеним Qt MVC, адаптованим до наших власних потреб. І самі, Model
і View
класи не мають нічого спільного з Qt MVC.
Куди ми поставили логіку ? Ми створили класи, які робили фактичні обчислення даних, читаючи дані з вихідних моделей (коли вони змінювалися) та записуючи результати в цільові моделі. З точки зору Qt, ці класи логіки будуть переглядами, оскільки вони "підключаються" до моделей (не "перегляд" для користувача, а "вид" для бізнес-логічної частини програми).
Де контролери ? У оригінальній термінології MVC контролери інтерпретують введення користувача (миша та клавіатура) та дають команди моделі для виконання запитуваної дії. Оскільки представлення Qt вже інтерпретують введення користувачів, як перейменування та переміщення елементів, це не було потрібно. Але нам потрібна була інтерпретація взаємодії користувачів, яка виходить за рамки поглядів Qt.