C++ Qt匿名信号

C++ Qt匿名信号,c++,oop,qt,signals,C++,Oop,Qt,Signals,是否可以在不连接的情况下将信号发送到插槽? 有一个类有一个显示一些日志的插槽。 目前,我们还没有任何信息表明将使用多少类向这个日志槽发送信号,我们也无法将它们的对象相互寻址,但每个对象都可能发送日志记录请求。您可以调用对象的公共槽,就像调用普通成员函数一样。不需要连接 此外,您不需要事先知道谁将连接到给定的插槽。这种联系可能发生在你的课堂之外。至少在公共时段。我认为没有这种可能性。但也许您可以将log方法设置为静态,这样您就可以在不引用logger对象的情况下调用log方法了?是的,您可以通过几

是否可以在不连接的情况下将信号发送到插槽? 有一个类有一个显示一些日志的插槽。
目前,我们还没有任何信息表明将使用多少类向这个日志槽发送信号,我们也无法将它们的对象相互寻址,但每个对象都可能发送日志记录请求。

您可以调用对象的公共槽,就像调用普通成员函数一样。不需要连接


此外,您不需要事先知道谁将连接到给定的插槽。这种联系可能发生在你的课堂之外。至少在公共时段。

我认为没有这种可能性。但也许您可以将log方法设置为静态,这样您就可以在不引用logger对象的情况下调用log方法了?

是的,您可以通过几种方式调用log方法

如果其他的C++功能,你可以调用它。时隙仍然是C++函数。缺点是调用方需要在编译时知道接收方的接口

logger.log("The frobnitz could not be quuxed");
您可以通过QMetaObject::invokeMethod调用插槽。使用此方法,调用者不需要任何关于接收者的编译时信息,只需要它是一个QObject*


虽然您确实可以像调用任何普通方法一样调用slot,因为它是一个普通方法,但此解决方案更干净,因为它实际上将对操作进行排队,并让事件循环处理它。当在线程之间传递消息时,如果您需要更动态的消息传递,这是一种方法。
if (!QMetaObject::invokeMethod(logger, "log", Q_ARG(QString, "The frobnitz could not be quuxed"))) {
    qWarning("Internal error: logging failed (did someone change the logger API?)");
}