通过eventFilter连接/断开信号

3
我有一个包含数百个自定义按钮的应用程序,每个按钮都需要进行多个信号连接。 连接调用似乎非常缓慢,因此我正在尝试通过主窗口的eventFilter使用输入和离开事件来连接/断开连接每个按钮的信号。
然而,有时会多次调用这些事件,导致运行时错误(当尝试断开已经消失的事件时)。 以下是一段代码片段,显示了类似(并且希望相关)的问题,使用默认的PushButton。 要在此处查看运行时错误,请运行代码,按下其中一个按钮,然后关闭窗口。那时我看到了这个:
RuntimeError: Fail to disconnect signal clicked().

这是代码。有人知道这是否是PySide的bug吗?

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_() )
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 )

...然后为类定义鼠标事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接