частные / публичные сигналы qt - PullRequest
32 голосов
/ 27 января 2010

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

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

Ответы [ 5 ]

23 голосов
/ 27 января 2010

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

Ключевое слово «сигналов» определено в qobjectdefs.h (строка 69, как для Qt 4.6.1):

#   define signals protected

ОБНОВЛЕНИЕ: сигналы относятся только к protected и включают все второстепенные версии Qt 4. Начиная с Qt 5.0 они public. Смотри https://stackoverflow.com/a/19130831.

18 голосов
/ 08 апреля 2011

Обычный способ, например видел в 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)), так как они требуют, чтобы сигнал был доступен.

14 голосов
/ 05 марта 2010

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

Как указал Андрей, сигнал - это только переопределение защищенного, то есть он может передаваться только тем классом, в котором он определен.

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

void emitTheSignal(...) {
  emit theSignal(...);
}
10 голосов
/ 29 сентября 2015

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

5 голосов
/ 27 января 2010

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

...