2011-02-01 84 views
2

大約6個月前我開始了一個GTKMM應用程序,它已經達到一切正常工作的地步,而且我實際上每天都在使用它。它本質上是一個數據庫應用程序,它從另一個應用程序中讀取數據文件,生成圖形並讓您輕鬆地對數據進行排序和查看。我喜歡。清理GTKmm應用程序的代碼

不過,我相信我的代碼是一個爛攤子,當我去實現今天的另一個特點,我意識到,我可能是錯誤的一步某處。

我的主窗口GUI是在空地文件和所有的GUI(比我的情節插件是基於一個GTK ::繪圖區自定義窗口小部件等)是在一個單一的文件中定義。它是完整的指向小部件和樹存儲的指針,它們都在構造函數中獲得設置並在析構函數中被刪除。

整個GUI是一個主窗口分割成不同窗格所以這是有意義的在1個文件的一切。另外,不同的窗格需要與其他窗格「溝通」。

我應該如何更好地組織我的代碼,因此它是維護?我是否創建了一個基本上是小部件集合的新類,然後在我的主窗口中放置該「超級小部件」(比如說每個窗格都是超級小部件)?

gtkmm的教程一般都非常簡約,所以我不能得到很大的啓示那裏。

回答

3

我目前在一個大的GTKMM應用程序上工作。在整個代碼庫中遵循的一般規則是每個Frame(包含widgets集合)都是它自己的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() 
+0

好的,這是有道理的。現在,什麼時候幀需要相互交談?例如,如果您按SomeGUIComponentA中的按鈕並且您需要刷新SomeGUIComponentB中的標籤?現在,因爲按鈕和標籤都在我的巨大GUI類中,所以它是微不足道的,但是每個框架都需要指向其他每個框架嗎? – 2011-02-01 20:47:49

3

我落得這樣做是小部件的每個邏輯分類收集到自己的類中的解決方案。然後我創建了在我的主GUI類中被捕獲並在那裏處理的信號。任何必須傳遞的東西都在主GUI類代碼中完成,但現在事情是有道理的。例如,我不關心在我的過濾器框架中更改的特定組合框值。相反,當Filter改變時,我感興趣。所以我的過濾器類(包含所有過濾器小部件)會拋出一個自定義的changed()信號,併爲該過濾器中的變量設置setter和getters,然後適當地更新這些小部件。

我覺得這種方式很乾淨,避免了單身,我的間隔化的用戶界面,使事情整體的方式更好的工作。