清理GTKmm应用程序的代码

时间:2011-02-01 02:37:16

标签: gtk gtkmm

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

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

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

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

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

GTKMM教程通常非常简约,所以我无法深入了解。

2 个答案:

答案 0 :(得分:3)

我目前正在开发一个大型GTKMM应用程序。整个代码库遵循的一般规则是每个Frame(包含一个小部件集合)在其自己的cpp文件中是它自己的类。然后,这些类在main函数中实例化为单例类,每个类都暴露一个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()

答案 1 :(得分:3)

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

我认为这种方式非常干净,避免单身,划分我的用户界面并使整体方式更好用。