清除GTKmm应用程序的代码

清除GTKmm应用程序的代码,gtk,gtkmm,Gtk,Gtkmm,我在大约6个月前开始使用GTKMM应用程序,现在一切都正常了,我每天都在使用它。它本质上是一个数据库应用程序,从另一个应用程序读取数据文件,生成图形,并让您轻松地排序和查看数据。我喜欢 然而,我相信我的代码是一团糟的,当我今天去实现另一个特性时,我意识到我可能在某个地方犯了错误 我的主窗口GUI是在glade文件中定义的,所有GUI(绘图小部件除外,绘图小部件是基于Gtk::DrawingArea的自定义小部件)都在一个文件中。它充满了指向小部件和树存储的指针,这些小部件和树存储都在构造函数中设

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

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

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

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

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


GTKMM教程通常是非常简单的,所以我在那里没有太多的见解。

我目前正在开发一个大型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()

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


我认为这种方式非常干净,避免了单例,划分了我的UI,使整个工作方式更加友好。

好的,这是有意义的。现在,当帧需要彼此对话时,该怎么办?例如,如果在SomeGUIComponentA中按下按钮,需要刷新SomeGUIComponentB中的标签?现在,由于按钮和标签都在我庞大的GUI类中,这很简单,但是每个帧是否需要指向其他帧呢?@baubie,在这种情况下,我们将在组件B中公开一个公共方法来更新私有标签,并从组件a调用:SomeGUIComponentB.getInstance().updateLabel(valueToUpdateWith);谢谢,这很有道理。自从发布这个问题以来,我已经读了很多关于这个的文章。你的回答肯定是正确的,所以我已作了标记。唯一的缺点是,由于与全局变量相同的原因,单身人士似乎变得非常沮丧。相反,我认为我可以将指向父窗口的指针传递给每个组件,并通过父窗口调用组件。