在閱讀了有趣的親子系統QObject
之後,我想知道Qt開發人員使用它來代替更傳統的容器有多普遍。假設內存鄰接不是必需的,看起來這提供了一些有趣的功能。使用QObject而不是容器
例如,你可以有一個QObject
並給它不同類型的孩子,然後根據它們的類型輕鬆地找到所有的孩子,給QObject一個動態的異構容器特徵,而不是所需的同質收集傳統的容器。
和QObject
自然管理其子女的記憶,這也很方便。
這是這個功能的常見用法嗎?
在閱讀了有趣的親子系統QObject
之後,我想知道Qt開發人員使用它來代替更傳統的容器有多普遍。假設內存鄰接不是必需的,看起來這提供了一些有趣的功能。使用QObject而不是容器
例如,你可以有一個QObject
並給它不同類型的孩子,然後根據它們的類型輕鬆地找到所有的孩子,給QObject一個動態的異構容器特徵,而不是所需的同質收集傳統的容器。
和QObject
自然管理其子女的記憶,這也很方便。
這是這個功能的常見用法嗎?
QObject::findChildren
可能比存儲你的對象像的QList標準集裝箱,因爲慢得多:
所有的上面,如果不需要你只需要使用QList<Type*> my_objects
。同樣在這種情況下:
QList<QPushButton*> panic_buttons
比findChildren<QPushButton*>()
更清楚。如果要製作異質容器,可以使用QHash<any_type_identifier, QObject*>
。它會更快。
也許,findChildren方法有時可能會更簡單。但是如果你有很多對象或者一個複雜的類,你最好使用普通的容器。你仍然可以使用QObject的內存管理而沒有任何問題。
正如@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派生。當然,如果你使用了很多標準的小部件,你不太可能爲它們創建新的類,但它是一個適合某些設計的選項。
有趣的,謝謝,但這個搖擺不定從我的問題。 – johnbakers
我認爲這可能取決於你正在開發什麼,但決定發佈它,以防萬一它幫助。 – TheDarkKnight
發佈一些有趣的東西沒有錯,謝謝 – johnbakers
好的意見,謝謝! – johnbakers
更重要的是 - 事物應該通常以他們的方式使用,並且'QObject'不是作爲容器設計的。這將是非常混亂。 –