我正在使用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
#===================================================================
我想用一些参数将信号与其他信号相结合,但我不知道该怎么做。
答案 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
信号。也可以使用int
,QWidget
或QObject
参数重新发出信号。