2010-12-02 87 views
3

我注意到QObject :: children()方法返回一個包含qobject的子對象的QObjectList的const引用。用qSort拋棄常量並對列表進行排序是否安全?Sorting QObject children

感謝 安東

回答

3

不,你不應該這樣做。這是QObject :: children()的定義:

inline const QObjectList &children() const { return d_ptr->children; } 

這意味着你直接得到內部對象列表的引用。 和文檔說:

注意,當 QWidget的兒童升高或降低 列表順序改變。引發 的小部件將成爲列表中的最後一個對象, ,並且降下來的小部件將變爲列表中的第一個對象 。

這個列表看起來像個壞主意。

+0

我檢查了QObject :: lower()等的代碼。看起來他們實際上是手動重新排列這個列表,就像我會這樣做。唯一的區別是QWidget是QObject的朋友,因此QWidget可以訪問d pimpl指針,這使得它可以訪問QObjectList而不需要常量。我會實際嘗試這種方法......如果有什麼不好的事情發生,我會在這裏發帖。 – 2010-12-03 19:28:14

1

可能。但爲什麼冒這個險呢?難道你只是複製QObjectList和排序您的本地副本?

+0

嗯,有一些原因,我有幾個`QObject`派生類,形成一棵樹,我希望葉以某種方式排序。存儲副本是一種方法,但會出現一些問題:1)當添加/刪除子項時,必須保持本地副本最新。 2)你不能調用QObject :: children()來獲得子元素,應該在派生類中引入一個特殊的函數(這些類除了QObject之外不共享任何基類),所以會有很多重複代碼。 – 2010-12-02 22:53:56