3

大约 6 个月前我开始了一个 GTKMM 应用程序,它已经达到了一切正常的地步,我实际上每天都在使用它。它本质上是一个数据库应用程序,它从另一个应用程序中读取数据文件,生成图表并让您轻松排序和查看数据。我喜欢。

然而,我相信我的代码是一团糟,当我今天去实现另一个功能时,我意识到我可能在某个地方转错了方向。

我的主窗口 GUI 是在一个 gade 文件中定义的,并且所有 GUI(除了我的绘图小部件,它是基于 Gtk::DrawingArea 的自定义小部件)都在一个文件中。它充满了指向小部件和树存储的指针,它们都在构造函数中设置并在析构函数中删除。

整个 GUI 是一个主窗口,分为不同的窗格,因此将所有内容放在一个文件中是有意义的。此外,不同的窗格需要与其他窗格“通信”。

我应该如何更好地组织我的代码以使其可维护?我是否要创建一个本质上是小部件集合的新类,然后将那个“超级小部件”放在我的主窗口中(比如每个窗格都是一个超级小部件)?

GTKMM 教程通常非常简约,因此我无法在那里获得太多见解。

4

2 回答 2

3

我目前正在处理一个大型 GTKMM 应用程序。整个代码库遵循的一般规则是每个 Frame(包含一组小部件)在其自己的 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()
于 2011-02-01T14:46:30.187 回答
3

我最终做的解决方案是将小部件的每个逻辑集合分离到它们自己的类中。然后我创建了在我的主 GUI 类中捕获并在那里处理的信号。任何必须传递的东西都在主 GUI 类代码中完成,但现在事情变得有意义了。例如,我不关心过滤器框架中更改的特定组合框值。相反,当过滤器更改时,我很感兴趣。所以我的过滤器类(包含所有过滤器小部件)会抛出一个自定义的 changed() 信号,并且我为该过滤器中的变量设置了 setter 和 getter,然后适当地更新小部件。

我认为这种方式非常干净,避免了单例,划分了我的 UI 并使整体上的东西更易于使用。

于 2011-02-02T19:13:38.553 回答