3

インターフェイスには 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    
    #===================================================================

いくつかのパラメーターを使用して信号を他の信号と接続することを考えましたが、その方法がわかりません。

4

2 に答える 2

1

これを行う正しい方法は、を使用することQSignalMapperです。

コード例:

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

triggeredこれにより、文字列「name」パラメータを使用して信号が再送信されます。int、、QWidgetまたはQObjectパラメータを使用して信号を再送信することもできます。

于 2012-08-04T17:10:17.920 に答える
1

Yapsi とは何かはわかりませんが、QObject.sender方法はあります。

QObject QObject.sender (自己)

シグナルによってアクティブ化されたスロットで呼び出された場合、シグナルを送信したオブジェクトへのポインターを返します。それ以外の場合は 0 を返します。ポインタは、このオブジェクトのスレッド コンテキストからこの関数を呼び出すスロットの実行中にのみ有効です。

この関数によって返されるポインターは、送信側が破棄された場合、またはスロットが送信側の信号から切断された場合に無効になります。

警告: この関数は、モジュール性のオブジェクト指向の原則に違反しています。ただし、多くの信号が 1 つのスロットに接続されている場合は、送信側にアクセスできると便利な場合があります。

警告: 上記のように、このオブジェクトのスレッドとは異なるスレッドから Qt.DirectConnection を介してスロットが呼び出された場合、この関数の戻り値は無効です。このタイプのシナリオでは、この関数を使用しないでください。

その他のヒント: http://blog.odnous.net/2011/06/frequently-overlooked-and-practical.html

于 2012-08-04T12:12:19.167 に答える