Разделение логики и пользовательского интерфейса

Я разрабатываю приложение GUI в Qt.

Это мое первое приложение GUI, и я не очень опытен и все еще должен бороться с некоторыми более продвинутыми аспектами C++ и Qt framework.

приложение довольно простое, с главным окном и некоторыми диалогами, где пользователь настраивает настройки и нажимает кнопку, а программа выполняет (довольно сложный) расчет, давая результат где-то на пользовательском интерфейсе.

сейчас, я проблема. Я помещаю все свои расчетные данные (которые статичны и загружены из ресурсов) и логику в отдельный класс. Я создаю экземпляр этого класса и классов UI. Теперь проблема заключается в том, как получить доступ к членам класса data/logic из класса UI? Скажем, в классе логики есть QStringList, и я хочу, чтобы определенный диалог получил доступ к этому списку и представил его пользователю, не делая его копий в памяти?

Я понимаю, что это, вероятно, очень простой C++ вопрос (Qt даже не актуален), но эй, не все мастера программирования. Спасибо за любой намек или помощь!

3 ответов


есть несколько способов сделать это, чтобы ваш вопрос был действительным.

  1. ваш класс GUI может быть получен из вашего класса логики. Не типичный подход, но это зависит от того, как ваше приложение предназначено. Одним из основных недостатков является то, что GUI должен оставаться в том же потоке, что и логика. Часто вы хотите, чтобы классы работали в нескольких потоках, чтобы тяжелые вычисления не замораживали GUI.

  2. ваш класс GUI может содержать указатель на ваш класс логики и / или наоборот. Это также может быть ссылкой для удобства, если ваш логический класс существует до класса GUI и переживает его. Затем вы можете передать ссылку на конструктор класса GUI и вам никогда не придется проверить, является ли указатель действителен.

  3. ваш класс GUI может получить доступ к членам данных через геттеры / сеттеры или напрямую, если вы хотите сделать их общедоступными или просто определить свой класс GUI как friend класс В класс логики. Даже если вы используете геттеры, они могут возвращать ссылки const, поэтому копия не участвует. Классы Qt, такие как QStringList, также имеют свой собственный подсчет ссылок, механизм копирования при записи, который избегает копий.

  4. ваш класс GUI может излучать сигналы, и логический класс может их получать. Увидеть механизм в Qt сигнал/слот. Это очень хорошо для таких событий, как кнопка "Начать расчет". Сигналы имеют два преимущества: (a) они могут проходить через потоки, однако, если приемник не является основным контуром, он получает немного более сложно; (б) объекты не должны видеть друг друга (без прохождения указателя), вы можете подключить сигналы к слотам в любом месте вашей программы, где вы видите оба объекта сразу.

обычно вы будете использовать смесь 2 и 3: Используйте геттеры для чтения данных из класса логики, представленного пользователю. Используйте сигналы, чтобы спровоцировать действие или манипулировать данными (пользователь делает выбор, логический класс должен реагировать).


существует модель программирования под названием MVC (Model - View - Control)

для простых случаев достаточно просто Model-View. Модель представляет данные, а представление-пользовательский интерфейс.

класс модели предоставляет некоторые интерфейсы set / get data. Класс модели обычно не знает о классе представления, но обычно он может уведомлять класс представления при изменении данных (это можно сделать с помощью сигнала/слота в Qt).

класс View содержит указатель на класс Model и использует интерфейсы Model class предоставляет для управления данными.


возможно, мне чего-то не хватает, но просто введите свой класс данных в класс UI через сеттер и выставьте метод класса данных как общедоступный. Вам нужно только передать указатель вашего класса данных, чтобы избежать каких-либо накладных расходов.