我在大约6个月前开始使用GTKMM应用程序,它已达到一切正常的程度,我实际上每天都在使用它。它本质上是一个数据库应用程序,它从另一个应用程序读取数据文件,生成图表并让您轻松地对数据进行排序和查看。我喜欢它。
然而,我相信我的代码是一团糟,当我今天去实现另一个功能时,我意识到我可能在某个地方做了一个错误的转弯。
我的主窗口GUI在glade文件中定义,并且所有GUI(除了我的绘图窗口小部件,它是基于Gtk :: DrawingArea的自定义窗口小部件)都在一个文件中。它是指向窗口小部件和树库的全部指针,它们都在构造函数中进行设置并在析构函数中删除。
整个GUI是一个分为不同窗格的主窗口,因此将所有内容都放在1个文件中是有意义的。此外,不同的窗格需要与其他窗格“通信”。
我应该如何更好地组织我的代码以使其可维护?我是否创建了一个基本上是小部件集合的新类,然后将“超级小部件”放在我的主窗口中(比如说每个窗格都是一个超级小部件)?
GTKMM教程通常非常简约,所以我无法深入了解。
答案 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,然后适当地更新小部件。
我认为这种方式非常干净,避免单身,划分我的用户界面并使整体方式更好用。