Подтвердить что ты не робот

Разве это имеет значение, используя общедоступные слоты вместо частных слотов в Qt?

В С++ public означает те элементы, которые доступны из любого места, где объект видим, private означает, что члены доступны только из других членов того же класса или из их друзей.

Но в Qt разность в private slots и public slots, похоже, не существует. Я начал писать Qt в последние дни, и я использовал private slots все время.

Кто-то сказал мне, что я должен использовать public slots. Так что теперь я озадачен. Я не могу найти справочную информацию в документах Qt.

Какая фактическая разница между двумя типами?

4b9b3361

Ответ 1

От Документация Qt:

Поскольку слоты являются нормальными функциями-членами, они следуют нормальным правилам С++ при вызове напрямую. Однако в качестве слотов они могут быть вызваны любым компонентом, независимо от его уровня доступа, через соединение с сигнальным слотом. Это означает, что сигнал, испущенный из экземпляра произвольного класса, может вызвать вызов частного слота в экземпляре несвязанного класса.

Что это означает: Из другого класса вы не можете вызывать частный слот как функцию, но если вы испускаете сигнал, подключенный к этому частному слоту, вы можете вызвать его.

Ответ 2

Частным/общедоступным доступом "проверяется" компилятором во время компиляции, но соединение с сигнальным слотом выполняется во время выполнения, а слоты вызывают некоторые механизмы QMetaObject (что-то вроде, например, invokeMethod).

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

Другим примером некоторых связанных "странных" материалов является вызов частных виртуальных функций, если они общедоступны в статическом типе указателя, который используется для вызова метода.

Ответ 3

@user2448027 ответ правильный, но поскольку в шаблоне дизайна Qt отсутствует недостающая точка, а различные приложения private slots vs. общедоступных слотов не упоминаются нигде, я решил ответить на этот вопрос старая тема: Выбирая отдельные слоты, вы вынуждаете пользователя объекта использовать функцию соединения для вызова слота напрямую. или → оператор

Представьте, что вы реализовали медленный или блокирующий код в одном из слотов вашего класса, и вы ожидаете, что пользователь класса переместит созданный объект в поток, поэтому класс владельца этого объекта (который может быть GUI или какой-либо объект, связанный с GUI) не будет зависеть или блокироваться, вызвав этот слот. В этом случае, если вызов в слот производится непосредственно с помощью операторов . или ->, он блокирует. Поскольку текущий поток метода вызывающего абонента будет использовать этот слот, это произойдет только в том случае, если вы использовали общедоступные слоты. Решение состоит в том, чтобы сделать слот частным, поэтому его использование может вызвать его напрямую через соединение.

Вывод:

  • Если у вас есть блокирующие слоты, обязательно используйте их как приватные слоты.
  • если слоты используются как простые настройки свойства для объект делает их общедоступными слотами.
  • наконец, если вам нужны некоторые методы, возвращающие значения или непостоянные ссылочные аргументы даже не делают их слотами (это это бессмыслица), достаточно только публики