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

时间:2012-08-04 11:51:39

标签: python plugins pyqt signals-slots qaction

我正在使用Python和PyQt,我的界面和Yapsi,用于添加插件。 Yapsy找到了我的所有插件,并将所有插件添加到mainWindow中的菜单中。每个插件都会被触发信号激活。 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 个答案:

答案 0 :(得分:1)

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

  

QObject QObject.sender(self)

     

如果在a中调用,则返回指向发送信号的对象的指针   由信号激活的插槽;否则它返回0.指针是   仅在执行调用此函数的插槽期间有效   来自这个对象的线程上下文。

     

如果发件人是,则此函数返回的指针将变为无效   销毁,或者插槽与发送者的信号断开连接。

     

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

     

警告:如上所述,此函数的返回值不是   通过来自线程的Qt.DirectConnection调用插槽时有效   与此对象的线程不同。不要在此使用此功能   情景类型。

此处提供了更多提示:http://blog.odnous.net/2011/06/frequently-overlooked-and-practical.html

答案 1 :(得分:1)

执行此操作的正确方法是使用QSignalMapper

示例代码:

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

这将使用字符串“name”参数重新发出triggered信号。也可以使用intQWidgetQObject参数重新发出信号。