3

何百ものカスタム ボタンを含むアプリがあり、それぞれに複数の信号接続が必要です。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_() )
4

1 に答える 1

0

マウスイベントをテストしたところ、イベントがアイテムクラスにアタッチされているときにパフォーマンスが向上することがほとんどありませんでした...そのため、サブクラス化しないでください。それよりも :

class Button(QPushButton):
    def __init__(self, label):
        super(Button, self).__init__()
        self.setText(label)

app = QApplication( sys.argv )
w = TestWindow()
for i in xrange(10):
    btn = Button( 'test %s' % i )
    w.addWidget( btn )

...次に、クラスのマウス イベントを定義します。

于 2013-05-14T08:04:13.867 に答える