如何在PyQt中重新实现QAction的triggered()信号?

3
我正在使用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个回答

1

正确的方法是使用QSignalMapper

示例代码:

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

这将使用字符串“name”参数重新发出已触发的信号。还可以使用intQWidgetQObject参数重新发出信号。


1

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

QObject QObject.sender (self)

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

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

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

警告:如上所述,当通过Qt.DirectConnection从与此对象的线程不同的线程调用槽时,此函数的返回值无效。不要在此类情况下使用此函数。

这里还有一些小贴士:http://blog.odnous.net/2011/06/frequently-overlooked-and-practical.html


Yapsy是一个简单的库,用于添加新插件。它非常适合使您的软件更加模块化。 - j.barrio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接