代码之家  ›  专栏  ›  技术社区  ›  j.barrio

如何在pyqt中为QAction重新实现triggered()信号?

  •  3
  • j.barrio  · 技术社区  · 12 年前

    我使用Python和PyQt作为接口,使用Yapsi作为添加插件。Yapsy找到了我所有的插件,并将所有插件添加到我的主窗口中的菜单中。每个插件都通过触发信号激活。这个QAction的信号没有参数,我需要知道是什么插件发出了信号。

    这是相关代码:

    pluginMenu = self.menuBar().addMenu("P&lugins")
    
    # Create plugin manager
    self.manager = PluginManager(categories_filter={ "Formatters": Formatter})
    self.manager.setPluginPlaces(["plugins"])
    
    # Load plugins
    self.manager.locatePlugins()
    self.manager.loadPlugins()
    
    # A do-nothing formatter by default
    self.formatters = {}
    
    for plugin in self.manager.getPluginsOfCategory("Formatters"):
    
    # plugin.plugin_object is an instance of the plugin
    print(plugin.plugin_object.name)
    # The method to create action associated each input to default triggered() signal
    newAction = self.createAction(plugin.plugin_object.name, slot=self.updatePreview())
    
    
    self.addActions(pluginMenu, (newAction, None))
    self.formatters[plugin.plugin_object.name] = (plugin.plugin_object, newAction)
    
    def updatePreview(self):
        # Here I need know what plugin emit the signal    
        #===================================================================
    

    我想用一些参数将信号与其他信号联系起来,但我不知道怎么做。

    2 回复  |  直到 8 年前
        1
  •  1
  •   warvariuc    12 年前

    我不知道Yapsi是什么,但有 QObject.sender 方法:

    QObject QObject.sender(自身)

    如果在 由信号激活的时隙;否则返回0。指针是 仅在调用此函数的插槽执行期间有效 来自该对象的线程上下文。

    如果发件人 或者如果插槽与发送器的信号断开连接。

    警告:此函数违反了的面向对象原则 模块化。但是,在以下情况下,访问发件人可能会很有用 许多信号连接到单个槽。

    警告:如上所述,此函数的返回值不是 当从线程通过Q.DirectConnection调用插槽时有效 与此对象的线程不同。不要在此中使用此函数 场景类型。

    这里有更多提示: http://blog.odnous.net/2011/06/frequently-overlooked-and-practical.html

        2
  •  1
  •   ekhumoro    12 年前

    正确的方法是使用 QSignalMapper

    示例代码:

    signalmap = QSignalMapper(self)
    signalmap.mapped[QString].connect(self.handler)
    ...
    signalmap.setMapping(action, name)
    action.triggered[()].connect(signalmap.map)
    

    这将重新发射 triggered 带有字符串“name”参数的信号。还可以使用 int , QWidget QObject 参数