PyQt4 でスロットとシグナルを動的に接続する
PyQt4 では、複数のスロットをプログラムでシグナルに接続すると、ループ内で実行すると予期しない動作が発生する可能性があります.
問題:
ループ内に動的に生成された数字ボタンを備えた電卓を作成することを検討してください。各ボタンの 'clicked()' 信号が次のように接続されている場合:
def __init__(self): for i in range(0, 10): self._numberButtons += [QPushButton(str(i), self)] self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda : self._number(i))
問題:
いずれかのボタンをクリックすると、すべて '9 が出力されます。 '。この動作は、Python のスコープとクロージャーのセマンティクスから発生します。ラムダ式は変数 i を参照し、ループ内で最終値 '9' に評価されます。
解決策:
この問題を回避するには、i を渡します。デフォルト値を持つキーワード引数として使用します:
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
または、よりクリーンなアプローチとして functools.partial を使用します:
self._numberButtons[i].clicked.connect(partial(self._number, i))
これらのソリューションは、ラムダ式内で i を分離し、それぞれがボタンをクリックすると、意図したアクションがトリガーされます。
以上が予期せぬ動作をせずに PyQt4 でスロットとシグナルを動的に接続する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。