【问题标题】:Qt anonymous signalsQt 匿名信号
【发布时间】:2011-04-17 19:40:08
【问题描述】:

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

【问题讨论】:

    标签: c++ oop qt signals


    【解决方案1】:

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

    此外,您无需提前知道谁将连接到给定插槽。这种联系可能发生在你的课堂之外。 (至少对于公共时段。)

    【讨论】:

      【解决方案2】:

      是的,您可以通过几种方式。

      您可以像调用任何其他 C++ 函数一样调用插槽(如果它是 public)。插槽仍然是 C++ 函数。缺点是调用者需要在编译时知道接收者的接口。

      logger.log("The frobnitz could not be quuxed");
      

      您可以通过QMetaObject::invokeMethod 调用插槽。使用这种方法,调用者不需要任何关于接收者的编译时信息,除了它是一个QObject*

      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?)");
      }
      

      【讨论】:

      • 虽然您确实可以像使用任何普通方法一样调用插槽(因为它是普通方法),但此解决方案更简洁,因为它实际上会将操作排队并让事件循环处理它。这是在线程之间传递消息时要走的路,如果您需要一些更动态的消息传递。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多