Очистить код приложения GTKmm - PullRequest
2 голосов
/ 01 февраля 2011

Я запустил приложение GTKMM около 6 месяцев назад, и оно дошло до того, что все работает, и я фактически использую его ежедневно. По сути, это приложение базы данных, которое считывает файлы данных из другого приложения, генерирует графики и позволяет легко сортировать и просматривать данные. Мне это нравится.

ОДНАКО, я считаю, что мой код - беспорядок, и когда я сегодня решил реализовать другую функцию, я понял, что, возможно, где-то сделал неправильный поворот.

Мой графический интерфейс главного окна определен в файле glade, и ВСЕ графический интерфейс (кроме моего графического виджета, который является пользовательским виджетом на основе Gtk :: DrawingArea) находятся в одном файле. Это ПОЛНЫЙ из указателей на виджеты и хранилища деревьев, которые все настраиваются в конструкторе и удаляются в деструкторе.

Весь графический интерфейс пользователя является главным окном, разделенным на разные панели, поэтому имеет смысл иметь все в одном файле. Кроме того, разные панели должны «общаться» с другими панелями.

Как мне лучше организовать свой код, чтобы его можно было обслуживать? Создать новый класс, который по сути является коллекцией виджетов, а затем поместить этот «супер виджет» в мое главное окно (скажем, каждая панель является супер виджетом)?

Учебные пособия по GTKMM, как правило, очень минималистичны, поэтому я не смог получить много понимания.

Ответы [ 2 ]

3 голосов
/ 02 февраля 2011

В итоге я решил разделить каждую логическую коллекцию виджетов на отдельный класс. Затем я создаю сигналы, которые были пойманы в моем мастер-классе GUI и обработаны там. Все, что должно быть передано, делается в коде мастер-класса GUI, но теперь все имеет смысл. Например, меня не волнует конкретное значение комбинированного списка, измененное в моем кадре фильтра. Вместо этого мне интересно, когда фильтр изменился, точка. Таким образом, мой класс фильтра (содержащий все виджеты фильтра) генерирует пользовательский сигнал change (), и у меня есть установщики и получатели для переменных в этом фильтре, которые затем соответствующим образом обновляют виджеты.

Я думаю, что этот способ очень чистый, избегает одиночных разрядов, разделяет мой пользовательский интерфейс и делает работу в целом более приятной.

3 голосов
/ 01 февраля 2011

В настоящее время я работаю над большим приложением GTKMM. Общее правило, которое соблюдается во всей кодовой базе, заключается в том, что каждый фрейм (содержащий коллекцию виджетов) является своим собственным классом в своем собственном файле cpp. Затем эти классы создаются в основной функции как одноэлементные классы, каждый из которых предоставляет метод getFrame.

// Single instance of this class.
SomeGUIComponent* SomeGUIComponent::m_instance = NULL;

SomeGUIComponent& SomeGUIComponent::getInstance()
{
  if (m_instance == NULL)
  {
    m_instance = new SomeGUIComponent();
  }
  return *m_instance;
}

Gtk::Frame& SomeGUIComponent::getFrame()
{
  return m_myMasterFrame;
}

Так что это может быть добавлено к большему приложению с помощью:

SomeGUIComponent::getInstance().getFrame()
...