Частные/общественные сигналы qt
Могут ли сигналы Qt быть публичными или частными? Могу ли я создать внутренние сигналы, которые видны только внутри класса?
Обновление: у меня есть класс с некоторыми внутренними сигналами. Как я могу сделать эти сигналы невидимыми для других классов (инкапсуляция и скрытие информации)?
Ответы
Ответ 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 для этого. Ваши личные сигналы существуют только в частной реализации.