何百ものカスタム ボタンを含むアプリがあり、それぞれに複数の信号接続が必要です。eventFilter
接続呼び出しはかなり遅いように見えるので、メイン ウィンドウのenter および leave イベントを使用して、各ボタンの信号を接続/切断しようとしています。
ただし、これらのイベントが複数回呼び出され、RuntimeErrors が発生する場合があります (既になくなっているイベントを切断しようとした場合)。以下は、デフォルトのプッシュボタンを使用した同様の (そしておそらく関連する) 問題を示すコードのスニペットです。ここで実行時エラーを確認するには、コードを実行し、ボタンの 1 つを押して、ウィンドウを閉じます。その時、私はこれを見ます:
RuntimeError: Fail to disconnect signal clicked().
これがコードです。これがPySideのバグかどうかは誰にもわかりませんか?
from PySide.QtGui import *
from PySide.QtCore import *
import sys
class TestWindow( QWidget ):
def __init__( self, parent=None ):
super( TestWindow, self ).__init__( parent )
self.setLayout( QGridLayout() )
def addWidget( self, w ):
self.layout().addWidget( w )
def testCB( self ):
print 'button connected'
def eventFilter( self, obj, event ):
'''Connect signals on mouse over'''
if event.type() == QEvent.Enter:
print 'enter',
obj.clicked.connect( self.testCB )
elif event.type() == QEvent.Leave:
print 'leave'
obj.clicked.disconnect( self.testCB )
return False
app = QApplication( sys.argv )
w = TestWindow()
for i in xrange(10):
btn = QPushButton( 'test %s' % i )
w.addWidget( btn )
btn.installEventFilter(w)
w.show()
sys.exit( app.exec_() )