c++ Qt信号可以是公共的、受保护的还是私有的?

qxgroojn  于 2023-03-05  发布在  其他
关注(0)|答案(8)|浏览(686)

Qt信号可以是公共的、受保护的还是私有的?我可以创建只在类内部可见的内部信号吗?

**更新:**我有一个类有一些内部信号。我怎样才能让其他类看不到这些信号(封装和信息隐藏)?

pokxtpni

pokxtpni1#

不能。信号不能是公共的或私有的。Qt信号是受保护的类方法。
在qobjectdefs. h中定义了“信号”关键字(第69行与Qt 4.6.1相同):

#   define signals protected

**更新:**信号仅为protected,包括Qt 4的所有次要版本。从Qt 5.0开始,信号为public。请参见https://stackoverflow.com/a/19130831

acruukt9

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))引入的新型连接,因为它们要求信号可访问。

qqrboqgw

qqrboqgw3#

信号在Qt4中是protected,在Qt5中是public。在Qt5中,您可以通过添加QPrivateSignal作为最后一个参数,使其成为privatehttp://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html

llmtgqce

llmtgqce4#

插槽是简单的方法,可以是公共的、受保护的或私有的。
正如Andrei所指出的,信号只是对protected的重新定义,这意味着它们只能由定义它们的类发出。
如果你想让一个类从另一个类发出信号,你必须给它添加一个公共方法(或插槽),如下所示:

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

dgenwo3n5#

Qt信号是公共的,从这个意义上说,任何对象都可以连接到任何信号。

u59ebvdq

u59ebvdq6#

所有现有答案都不正确。
通过将QPrivateSignal类型作为最后一个参数添加到其定义中,可以使信号成为私有的:

signals:
  
  void mySignal(QPrivateSignal);

QPrivateSignal是由Q_OBJECT宏在每个QObject子类中创建的私有结构体,因此您只能在当前类中创建QPrivateSignal对象。
从技术上讲,信号仍然具有公共可见性,但只能由创建它的类发出。

w1e3prcc

w1e3prcc7#

现在你可以使用Q_SIGNAL宏和普通的C++访问说明符:

protected:
  Q_SIGNAL void myProtectedSignal();

private:
  Q_SIGNAL void myPrivateSignal();
lndjwyie

lndjwyie8#

你可以使用PIMPL模式,你的私有信号只存在于私有实现中。

相关问题