2012-08-04 51 views
2

我使用Python与PyQt,我的界面和Yapsi,添加插件。 Yapsy找到了我所有的插件,并将所有插件添加到我的mainWindow中的一个菜单中。每个插件都由触发信号激活。 QAction的这个信号没有参数,我需要知道哪个插件发出了信号。如何在pyqt中为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  
    #=================================================================== 

我认为瞬移与一些PARAMS其它信号的信号,但我不知道该怎么做。

回答

0

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

QObject的QObject.sender(个体经营)

返回一个指针发出的信号的对象,如果调用在由信号激活的 插槽中;否则返回0.指针 仅在执行插槽时有效,该插槽从该对象的线程上下文中调用此函数 。

如果发件人销毁 或插槽与发件人信号断开连接,此功能返回的指针变为无效。

警告:此功能违反 模块化的面向对象原则。但是,当许多信号连接到单个插槽时,访问发送者可能会很有用。

警告:如上所述,当从不同于此对象线程的线程 通过Qt.DirectConnection调用插槽时,此函数的返回值不是 有效。请勿在此 类型的方案中使用此功能。

一些更多的技巧在这里:http://blog.odnous.net/2011/06/frequently-overlooked-and-practical.html

+0

Yapsy是添加新插件的简单库。这对于使您的软件更加模块化很有好处。 – 2012-08-04 16:17:58

0

做到这一点,正确的方法是用QSignalMapper

示例代码:

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

这将重新发射triggered信号与字符串“名称”参数。也可以用int,QWidgetQObject参数重新发射信号。