2010-12-02 2 views
3

Я заметил, что метод QObject :: children() возвращает ссылку const на QObjectList, содержащую дочерние объекты qobject. Будет ли безопасно отбрасывать константу и сортировать список с помощью qSort?Сортировка QObject children

Благодаря Антон

ответ

3

Нет, вы не должны этого делать. Это определение QObject :: дети():

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

Это означает, что вы сразу получите ссылку внутреннего ObjectList. И документация говорит:

Обратите внимание, что порядок перечисления изменяется при QWidget детей воспитываются или понижены. Виджет, который поднят , становится последним объектом в списке, и виджет, который опускается, становится первым объектом в списке.

Похоже, что плохая идея возиться с этим списком.

+0

Я проверил код для QObject :: lower() et al. Похоже, что они действительно переупорядочивают этот список вручную, как и я. Единственное отличие состоит в том, что 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