【问题标题】:Qt Map Signals Based On Parameter Value基于参数值的 Qt 映射信号
【发布时间】:2009-10-14 11:12:20
【问题描述】:

我知道我可以使用QSignalMapper 根据连接调用具有不同参数的插槽。我想要实现的有点不同。

我们在应用程序中使用插件,不同的插件负责不同类型的对象。我们将多个插槽(每个插槽都在不同的插件中实现)连接到主应用程序发出的一个信号。信号的参数之一是QString,指示与信号关联的对象类型。目前,我们正在插槽中检查此参数,如果该类型由插件处理,则继续。这有一个缺点,每个插件都会做这个检查,如果可能的话我想避免这种情况。

我想将所有插槽连接到同一个信号,当信号发出时,根据QString 参数的值,只调用适当的插槽,有点像QSignalMapper,但方式不同.

是否有任何内置机制可以做到这一点?如果没有,关于我如何实现这一目标的任何想法?

提前谢谢你。

【问题讨论】:

    标签: c++ qt mapping signals-slots


    【解决方案1】:

    我认为没有相应的组件,但您可以像这样创建自己的信号映射器:

    1. 创建一个 MySignalMapper 组件
    2. 编写 addSourceSignal 方法来设置主应用的信号
    3. 编写一个 addDestinationSlot 方法,该方法采用 QString/slot 对并将字符串映射到 slot。
    4. 在您的组件中将源信号连接到基于 qstring 值调度的自定义槽。您可以使用 QMetaObject::invokeMethod 调用插槽。

    【讨论】:

      【解决方案2】:

      Qxt 有一个专门用于此功能的类。您可以使用 QxtCore 模块中的 QxtSlotMapper 类。

      http://libqxt.bitbucket.org/doc/tip/qxtslotmapper.html

      【讨论】:

        【解决方案3】:

        您可以将“type”字符串的允许值限制为仅是有效的 C++ 函数名称。强制插件根据它们处理的类型命名它们的插槽,然后为每个插件简单地尝试连接适当命名的插槽。

        换句话说,你可以做QMetaObject::connectSlotsByName 的事情,除了实现你自己的命名约定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-25
          • 2016-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-28
          • 1970-01-01
          相关资源
          最近更新 更多