【问题标题】:Clean up the code of a GTKmm application清理 GTKmm 应用程序的代码
【发布时间】:2011-06-19 00:06:07
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: gtk gtkmm


    【解决方案1】:

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

    【讨论】:

    • 好的,有道理。现在,什么时候框架需要相互通信呢?例如,如果您在 SomeGUIComponentA 中按下一个按钮,并且您需要刷新 SomeGUIComponentB 中的标签?现在,由于按钮和标签都在我巨大的 GUI 类中,这很简单,但是每个帧都需要指向其他帧吗?
    • @baubie,在这种情况下,我们将在组件 B 中公开一个公共方法来更新私有标签并从 ComponentA 调用:SomeGUIComponentB.getInstance().updateLabel(valueToUpdateWith);
    • 谢谢,这是有道理的。自从发布这个问题以来,我一直在做很多关于这个的阅读。你的回答肯定是有效的,所以我已经这样标记了。唯一的缺点是,由于与全局变量相同的原因,单例似乎变得非常不受欢迎。相反,我想我可能会将指向父窗口的指针传递给每个组件,并通过父窗口调用组件。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多