Зачем использовать QObject:: setObjectName()?

Почему мы должны добавлять имя объекта в QObject? Я все еще могу загрузить и запустить любой объект без установки имени.

4 ответов


Ну, это зависит от того, как вы планируете получать доступ к QObject позже. Существует несколько QObject.функции find (), которые можно использовать для получения доступа к QObject. Имя добавляет "ключ" для фильтрации поиска.

например, в вашем собственном классе вы, вероятно, используете переменные экземпляра для этого вместо поиска, но на самом деле вам может быть передано что-то, чем вы обычно не владеете, но вы знаете, что есть определенная кнопка, которую вы хотите изменить (например, QPushButton в одном из Qt встроенные QInputDialogs). Придание кнопке имени упрощает поиск (и является надежным, если кнопка исчезает,перемещается в макете и т. д.), в то время как проверка текста кнопки или подсчет, где он находится в иерархии, будет гораздо более хрупким (например, текст кнопки может меняться между версиями или из-за локализации, кто-то добавляет новый макет, дополнительную кнопку).

или вам просто может понадобиться хороший отладочный текст при печати значений указателя (т. е. вы хотите знать, какой QObject вызывает проблему). Это также упрощает создание сценариев, но я не буду объяснять, почему здесь.

Это действительно только верхушка айсберга. Вам действительно нужно только установить имя, если у вас есть потребность в нем, и только вы знаете этот ответ. :-)


вы можете использовать имя объекта как ID-селектор В таблицах стилей Qt.

пример: если вы хотите, чтобы свойство применялось только к одному конкретному QLineEdit, вы можете дать ему имя с помощью QObject:: setObjectName () и использовать селектор ID для ссылки на него:

 myDialog->setStyleSheet("QLineEdit#nameEdit { background-color: yellow }");

есть несколько причин, одна из главных причин, по которой я использую имена объектов, - это отладка, как описано в руководстве Qt qdebug.


это имеет смысл в случае, если объект является сценарием и может использоваться с findChild как this

//button is the object name, which needs to be define in qml for the component.e.g. objectName: "button"
QObject *buttonQML = view.rootObject()->findChild<QObject*>("button"); 

где "button" - имя объекта