В прежние времена у вас не было выбора, кроме как использовать слоты, если вы хотите подключиться к сигналам. Это уже не так в Qt 5, где можно подключать обычные функции-члены или даже бесплатные функции или лямбды.
Объявление регистров слота, которые функционируют в метаданных этого конкретного объекта, что делает его доступным для всех функций Qt, которые зависят от метаобъекта. Помимо этого, это регулярная функция-член, как указано в документации. В самой функции слота нет ничего особенного, разница в генерации метаданных для него в метаобъекте.
Это означает, что объявление слотов происходит за небольшую плату, хотя и небольшую, как во время компиляции, так и в исполняемом размере. Я бы сказал, что это излишне, чтобы все ваши публичные функции были слотами. Было бы более эффективно использовать слоты, когда вам действительно нужны слоты, если они не могут работать с обычной функцией, сделать это слотом.
Также обратите внимание, что почти во всех случаях сигналы объявляются с типом возврата void
. Это связано с типичным случаем использования сигналов - они часто могут передавать параметр, но редко возвращают что-либо. Несмотря на то, что можно вернуть значение через сигнал, подключенный к слоту, это используется крайне редко. Поэтому не имеет смысла объявлять функцию, которая возвращает что-то в качестве слота, на который вы собираетесь подключиться, поскольку сам факт, что он возвращает значение, означает, что он, скорее всего, не будет использоваться в типичном контексте сигнала/слота. Вот почему геттер не является слотом в этом примере. Setter как слот является избыточным в Qt 5 и, вероятно, является продуктом этого примера кода, относящегося к Qt 4.
Наконец, разделение слотов из обычных публичных функций - хороший способ проиллюстрировать намерение или «API "этого класса, если хотите.Например, я чаще использую слоты при расширении QML, поэтому мне не нужно отмечать каждую функцию явно как invokable - в отличие от сценария, упомянутого в предыдущем параграфе, такие слоты часто возвращают материал, но они действительно не используются в соединениях. Таким образом, я получаю четкий обзор дизайна интерфейса, который предоставляет класс.
Этот ответ не имеет ни малейшего смысла, и, похоже, даже не затрагивает вопрос. – MrEricSir
Можете ли вы использовать возвращаемые значения в слотах? Или даже правильно получить значение ссылочного параметра? – SuperFliege
@SuperFliege - слот - это просто функция, он будет работать точно так же, как функция. Многопоточность и время жизни объекта - совершенно другое дело, и влияют на регулярные функции так же сильно, как и на слоты. – dtech