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    
    #===================================================================

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

4

2 回答 2

1

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

QObject QObject.sender (self)

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

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

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

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

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

于 2012-08-04T12:12:19.167 回答
1

正确的方法是使用QSignalMapper.

示例代码:

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

This will re-emit the triggered signal with a string "name" parameter. It's also possible to re-emit signals with an int, QWidget or QObject parameter.

于 2012-08-04T17:10:17.920 回答