Qt信号可以是公共的、受保护的还是私有的?我可以创建只在类内部可见的内部信号吗?
**更新:**我有一个类有一些内部信号。我怎样才能让其他类看不到这些信号(封装和信息隐藏)?
pokxtpni1#
不能。信号不能是公共的或私有的。Qt信号是受保护的类方法。在qobjectdefs. h中定义了“信号”关键字(第69行与Qt 4.6.1相同):
# define signals protected
**更新:**信号仅为protected,包括Qt 4的所有次要版本。从Qt 5.0开始,信号为public。请参见https://stackoverflow.com/a/19130831。
protected
public
acruukt92#
一个常见的方法,例如在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中,Q_MOC_RUN只在moc运行时定义。
**编辑:**这种方法不适用于Qt 5(connect(a, &A::someSignal, b, &B::someSlot))引入的新型连接,因为它们要求信号可访问。
connect(a, &A::someSignal, b, &B::someSlot)
qqrboqgw3#
信号在Qt4中是protected,在Qt5中是public。在Qt5中,您可以通过添加QPrivateSignal作为最后一个参数,使其成为private。http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
QPrivateSignal
private
llmtgqce4#
插槽是简单的方法,可以是公共的、受保护的或私有的。正如Andrei所指出的,信号只是对protected的重新定义,这意味着它们只能由定义它们的类发出。如果你想让一个类从另一个类发出信号,你必须给它添加一个公共方法(或插槽),如下所示:
void emitTheSignal(...) { emit theSignal(...); }
dgenwo3n5#
Qt信号是公共的,从这个意义上说,任何对象都可以连接到任何信号。
u59ebvdq6#
所有现有答案都不正确。通过将QPrivateSignal类型作为最后一个参数添加到其定义中,可以使信号成为私有的:
signals: void mySignal(QPrivateSignal);
QPrivateSignal是由Q_OBJECT宏在每个QObject子类中创建的私有结构体,因此您只能在当前类中创建QPrivateSignal对象。从技术上讲,信号仍然具有公共可见性,但只能由创建它的类发出。
Q_OBJECT
QObject
w1e3prcc7#
现在你可以使用Q_SIGNAL宏和普通的C++访问说明符:
Q_SIGNAL
protected: Q_SIGNAL void myProtectedSignal(); private: Q_SIGNAL void myPrivateSignal();
lndjwyie8#
你可以使用PIMPL模式,你的私有信号只存在于私有实现中。
8条答案
按热度按时间pokxtpni1#
不能。信号不能是公共的或私有的。Qt信号是受保护的类方法。
在qobjectdefs. h中定义了“信号”关键字(第69行与Qt 4.6.1相同):
**更新:**信号仅为
protected
,包括Qt 4的所有次要版本。从Qt 5.0开始,信号为public
。请参见https://stackoverflow.com/a/19130831。acruukt92#
一个常见的方法,例如在kdelibs中看到的,是这样的:
这使得信号私有化,即它只能由类本身发出,而不能由它的子类发出。为了不使“private:“覆盖Q_SIGNALS(moc将不会看到somePrivateSignal作为信号),它位于Q_MOC_RUN中,Q_MOC_RUN只在moc运行时定义。
**编辑:**这种方法不适用于Qt 5(
connect(a, &A::someSignal, b, &B::someSlot)
)引入的新型连接,因为它们要求信号可访问。qqrboqgw3#
信号在Qt4中是
protected
,在Qt5中是public
。在Qt5中,您可以通过添加QPrivateSignal
作为最后一个参数,使其成为private
。http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.htmlllmtgqce4#
插槽是简单的方法,可以是公共的、受保护的或私有的。
正如Andrei所指出的,信号只是对protected的重新定义,这意味着它们只能由定义它们的类发出。
如果你想让一个类从另一个类发出信号,你必须给它添加一个公共方法(或插槽),如下所示:
dgenwo3n5#
Qt信号是公共的,从这个意义上说,任何对象都可以连接到任何信号。
u59ebvdq6#
所有现有答案都不正确。
通过将
QPrivateSignal
类型作为最后一个参数添加到其定义中,可以使信号成为私有的:QPrivateSignal
是由Q_OBJECT
宏在每个QObject
子类中创建的私有结构体,因此您只能在当前类中创建QPrivateSignal
对象。从技术上讲,信号仍然具有公共可见性,但只能由创建它的类发出。
w1e3prcc7#
现在你可以使用
Q_SIGNAL
宏和普通的C++访问说明符:lndjwyie8#
你可以使用PIMPL模式,你的私有信号只存在于私有实现中。