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

Частные/общественные сигналы qt

Могут ли сигналы Qt быть публичными или частными? Могу ли я создать внутренние сигналы, которые видны только внутри класса?

Обновление: у меня есть класс с некоторыми внутренними сигналами. Как я могу сделать эти сигналы невидимыми для других классов (инкапсуляция и скрытие информации)?

4b9b3361

Ответ 1

Нет. Сигналы не могут быть общедоступными или частными. Сигналы Qt являются защищенными методами класса.

"signal" ключевое слово определено в qobjectdefs.h(строка 69 как для Qt 4.6.1):

#   define signals protected

UPDATE: только protected upto и включают все второстепенные версии Qt 4. Начиная с Qt 5.0, они public. См. fooobar.com/questions/204795/....

Ответ 2

Обычный способ, например. в kdelibs, это:

Q_SIGNALS:
#ifndef Q_MOC_RUN
    private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private
#endif

   void somePrivateSignal();

Это делает сигнал конфиденциальным, т.е. он может быть испущен только самим классом, но не его подклассами. Чтобы не сделать "private:" отменено Q_SIGNALS (moc не будет видеть somePrivateSignal в качестве сигнала тогда), он внутри Q_MOC_RUN, который определяется только при запуске moc.

Изменить: Этот подход не работает для подключений нового стиля, введенных с Qt 5 (connect(a, &A::someSignal, b, &B::someSlot)), поскольку они требуют, чтобы сигнал был доступен.

Ответ 3

Слоты - это простые методы, которые могут быть общедоступными, защищенными или частными.

Как заметил Андрей, сигнал является лишь переопределением защищенных, то есть они могут быть испущены только классом, в котором они определены.

Если вы хотите, чтобы класс излучал сигнал от anoter one, вы должны добавить его общедоступным методом (или слотом), подобным этому:

void emitTheSignal(...) {
  emit theSignal(...);
}

Ответ 4

Сигналы были protected в Qt4, в Qt5 они public. Int Qt5 вы можете сделать их private, добавив QPrivateSignal в качестве последнего аргумента. Подробнее об этом: http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html

Ответ 5

Сигналы Qt являются общедоступными в том смысле, что любой объект может подключаться к любому сигналу.

Ответ 6

Вы можете использовать шаблон PIMPL для этого. Ваши личные сигналы существуют только в частной реализации.