我注意到QObject :: children()方法返回一個包含qobject的子對象的QObjectList的const引用。用qSort拋棄常量並對列表進行排序是否安全?Sorting QObject children
感謝 安東
我注意到QObject :: children()方法返回一個包含qobject的子對象的QObjectList的const引用。用qSort拋棄常量並對列表進行排序是否安全?Sorting QObject children
感謝 安東
不,你不應該這樣做。這是QObject :: children()的定義:
inline const QObjectList &children() const { return d_ptr->children; }
這意味着你直接得到內部對象列表的引用。 和文檔說:
注意,當 QWidget的兒童升高或降低 列表順序改變。引發 的小部件將成爲列表中的最後一個對象, ,並且降下來的小部件將變爲列表中的第一個對象 。
這個列表看起來像個壞主意。
可能。但爲什麼冒這個險呢?難道你只是複製QObjectList
和排序您的本地副本?
嗯,有一些原因,我有幾個`QObject`派生類,形成一棵樹,我希望葉以某種方式排序。存儲副本是一種方法,但會出現一些問題:1)當添加/刪除子項時,必須保持本地副本最新。 2)你不能調用QObject :: children()來獲得子元素,應該在派生類中引入一個特殊的函數(這些類除了QObject之外不共享任何基類),所以會有很多重複代碼。 – 2010-12-02 22:53:56
我檢查了QObject :: lower()等的代碼。看起來他們實際上是手動重新排列這個列表,就像我會這樣做。唯一的區別是QWidget是QObject的朋友,因此QWidget可以訪問d pimpl指針,這使得它可以訪問QObjectList而不需要常量。我會實際嘗試這種方法......如果有什麼不好的事情發生,我會在這裏發帖。 – 2010-12-03 19:28:14