Я заметил, что метод QObject :: children() возвращает ссылку const на QObjectList, содержащую дочерние объекты qobject. Будет ли безопасно отбрасывать константу и сортировать список с помощью qSort?Сортировка QObject children
Благодаря Антон
Я заметил, что метод QObject :: children() возвращает ссылку const на QObjectList, содержащую дочерние объекты qobject. Будет ли безопасно отбрасывать константу и сортировать список с помощью qSort?Сортировка QObject children
Благодаря Антон
Нет, вы не должны этого делать. Это определение QObject :: дети():
inline const QObjectList &children() const { return d_ptr->children; }
Это означает, что вы сразу получите ссылку внутреннего ObjectList. И документация говорит:
Обратите внимание, что порядок перечисления изменяется при QWidget детей воспитываются или понижены. Виджет, который поднят , становится последним объектом в списке, и виджет, который опускается, становится первым объектом в списке.
Похоже, что плохая идея возиться с этим списком.
Может быть. Но зачем рисковать? Не можете ли вы просто скопировать QObjectList
и отсортировать местную копию?
Ну, есть некоторые причины, у меня есть пары `QObject` производных классов, которые образуют дерево, и я хочу, чтобы листья были отсортированы каким-то образом. Сохранение копии - это способ, но возникает несколько проблем: 1) Вы должны обновлять локальную копию, когда дети добавляются/удаляются. 2) Вы не можете вызвать QObject :: children(), чтобы получить детей, на производные классы должна быть введена специальная функция (эти классы не разделяют никаких базовых классов, кроме QObject), поэтому будет много повторяющегося кода , – 2010-12-02 22:53:56
Я проверил код для QObject :: lower() et al. Похоже, что они действительно переупорядочивают этот список вручную, как и я. Единственное отличие состоит в том, что QWidget является другом QObject, поэтому QWidget имеет доступ к указателю d pimpl, который дает ему доступ к QObjectList без константы. Я на самом деле попробую этот подход ... Если что-нибудь случится, я отправлю сюда. – 2010-12-03 19:28:14