2013-10-07 14 views
4

在閱讀了有趣的親子系統QObject之後,我想知道Qt開發人員使用它來代替更傳統的容器有多普遍。假設內存鄰接不是必需的,看起來這提供了一些有趣的功能。使用QObject而不是容器

例如,你可以有一個QObject並給它不同類型的孩子,然後根據它們的類型輕鬆地找到所有的孩子,給QObject一個動態的異構容器特徵,而不是所需的同質收集傳統的容器。

QObject自然管理其子女的記憶,這也很方便。

這是這個功能的常見用法嗎?

回答

5

QObject::findChildren可能比存儲你的對象像的QList標準集裝箱,因爲慢得多:

  1. 它每一次遍歷所有的孩子。它甚至可以遞歸搜索(但可以禁用)。
  2. 它執行運行時類型檢查。
  3. 它每次構造新的QList。這可能會很慢並且很昂貴,因爲結果中有很多對象。

所有的上面,如果不需要你只需要使用QList<Type*> my_objects。同樣在這種情況下:

  1. 您可以命名您的收藏。 QList<QPushButton*> panic_buttonsfindChildren<QPushButton*>()更清楚。
  2. 您可以擁有多個相同類型的對象集合。

如果要製作異質容器,可以使用QHash<any_type_identifier, QObject*>。它會更快。

也許,findChildren方法有時可能會更簡單。但是如果你有很多對象或者一個複雜的類,你最好使用普通的容器。你仍然可以使用QObject的內存管理而沒有任何問題。

+0

好的意見,謝謝! – johnbakers

+0

更重要的是 - 事物應該通常以他們的方式使用,並且'QObject'不是作爲容器設計的。這將是非常混亂。 –

1

正如@PavelStrakhov所述,使用QObject :: findChildren可能會更慢。但是,我使用的一種方法是將存儲對象合併到QList中,並且具有QObject父層次結構。它立足於做這樣的事情: -

class BaseObject : public QObject 
{ 
    Q_OBJECT 

    public: 

     static BaseObject* FindObject(unsigned int id); // find object by id 

    private: 
     unsigned int m_id; 

     static unsigned int s_nextId; // next id for a new BaseObject 
     static QList<QBaseObject*> s_objectsList; // list of all BaseObject-type instances 
}; 

中的所有對象現在繼承BaseObject代替的QObject。當創建一個新類時,BaseObject的構造函數將設置項目的ID,遞增s_nextId,最後,該對象被添加到s_objectsList中。查找對象現在是搜索靜態對象列表的簡單事情。

這可能不適合您正在開發的應用程序的設計,但它確實對我有幫助,特別是在使用QGraphicsView/QGraphicsScene系統時。在這種情況下,BaseObject從QGraphicsObject派生。當然,如果你使用了很多標準的小部件,你不太可能爲它們創建新的類,但它是一個適合某些設計的選項。

+0

有趣的,謝謝,但這個搖擺不定從我的問題。 – johnbakers

+0

我認爲這可能取決於你正在開發什麼,但決定發佈它,以防萬一它幫助。 – TheDarkKnight

+1

發佈一些有趣的東西沒有錯,謝謝 – johnbakers

相關問題