Signals and Slots in PySide/ja
PySideのシグナルとスロット
このページではPySideのシグナルとスロットの使い方を説明します。いわゆる新スタイルのシグナルとスロットの使い方を中心に説明しますが、参考として旧スタイルの使い方も合わせて紹介します。
PyQtでは、新スタイルのシグナルとスロットはPyQt v4.5から導入されました。この新スタイルの目的は、PythonプログラマによりPythonicな構文を提供することです。PySideは PSEP 100 [pyside.org] をこの実装のガイドラインとして使用しています。
旧スタイルの方法 SIGNALとSLOT
QtCore.SIGNAL と QtCore.SLOT マクロは、Qtのシグナル/スロット配信機構とPythonをつなぐインタフェースであり、旧スタイルのシグナル/スロットの使い方です。
次の例ではQPushButtonの一般的なシグナルであるclickedシグナルを使用しています。旧スタイルではマクロ経由のシグナルと接続先のスロットをオブジェクトに伝えるため、connectメソッドはpythonに馴染みにくい構文になります。
新スタイルの方法 Signal()とSlot()
新スタイルでは新しい構文を使ってシグナルとスロットを接続します。先ほどの例は次のようにすっきりと書くことができます。
QtCore.Signal()の使い方
シグナルは QtCore.Sginal() クラスを使って定義します。シグナルのパラメータとしてPythonとCの型が指定できます。オーバーロードをする場合は、複数のパラメータをタプルやリストを使って指定します。
またクラスはシグナル名を定義する名前付き引数(キーワード引数) name を持っています。キーワード name が未指定の場合、代入先の変数名がシグナル名になります。
以下の例題集で、 QtCore.Signal() の使用例をまとめています。
注:シグナルは QObject を継承したクラス内でのみ定義してください。これにより、シグナル情報がQMetaObjectクラスの構造体に追加されます。
QtCore.Slot()の使い方
スロットの指定やオーバーロードには QtCore.Slot() デコレータを使います。スロットのパラメータ定義は QtCore.Signal() と同じく型を指定します。ただしオーバーロードの場合、 Signal() クラスのようにタプルやリストによるパラメータ指定は行いません。代わりにパラメータ毎に新たなデコレータを定義します。以下の例題でこの違いが明確に分かると思います。
また、キーワード引数も異なります。 Slot() は name 、 result の2つのキーワード引数を受けとります。 result キーワードは返却型を定義し、CとPythonの型を指定できます。 name キーワードは Signal() と同様に、未指定の場合には関数名がスロット名になります。
例題集
以下の例では、PySideのシグナルとスロットの定義、および接続方法を示しています。基本的な例とより複雑な例を示します。
- 次の例は、基本的なHello Worldプログラムです。パラメータを指定せずにシグナルとスロットを接続しています。
- 次の例は、引数が追加されたHello Worldプログラムの修正版です。スロットに引数が追加され、さらに新しいシグナルが作成されています。
- 次はオーバーロードを行います。前回のプログラムを少し修正して、オーバーロードのデコレータを作ります。
- 最後の例では、スロットとシグナルをオーバーロードし、複雑な接続と送出を行います。
PyQtとの互換性
PyQtの新スタイルとは、シグナル/スロット関数の命名規則が異なります。新スタイルのPyQtからPySideへの変換は、次のいずれかの方法で修正してください。
または次のようにします。
この修正によってpyqtSignal/pyqtSlotコールが、PySideのSignal/Slotコールに変換されます。