Для сигнала NOTIFY для свойства, какая разница, если я даю ему параметр?

Предположим, у меня есть класс, который выглядит так:

class Something : QObject {
  Q_PROPERTY(int something READ getSomething NOTIFY somethingChanged)

  // ...

  signals:
    void somethingChanged();
}

Согласно документации, объявление somethingChanged как void somethingChanged() и void somethingChanged(int) (обратите внимание на параметр) допустимо. Почему я должен делать это одним способом, а не другим?


person JesseTG    schedule 18.03.2017    source источник


Ответы (1)


Выдача значения позволяет вам использовать это значение без ссылки на объект, свойством которого оно является. Именно так все обычно делается в C++ API, это избавляет вас от необходимости вручную сохранять ссылки на объекты, чтобы вы могли прочитать значение при уведомлении об изменении. Обратите внимание, что даже в этом случае вы можете использовать QObject::sender() для поиска объекта-отправителя, если это необходимо, но передача значения является более простой.

В QML вы в конечном итоге используете привязки, которые очень быстрые и мощные и включают в себя ссылки на объекты, а уведомления об изменениях заставляют выражения привязки, которые ссылаются на свойства, автоматически переоценивать. Таким образом, нет необходимости выдавать фактическое значение.

Ничто не мешает вам иметь лучшее из обоих миров. Сигнал уведомления, который выдает новое значение, отлично работает с привязками QML. Поэтому, если по какой-то причине вам нужно передать значение, не уклоняйтесь от этого, это не поставит под угрозу совместимость с QML.

person dtech    schedule 18.03.2017