【问题标题】:Connecting/disconnecting signals via eventFilter通过 eventFilter 连接/断开信号
【发布时间】:2012-06-20 00:46:00
【问题描述】:

我有一个包含数百个自定义按钮的应用,每个按钮都需要多个信号连接。连接调用似乎很慢,所以我尝试使用进入和离开事件通过主窗口的eventFilter 连接/断开每个按钮的信号。

但是,有时这些事件似乎被多次调用,从而导致 RuntimeErrors(尝试断开已经消失的事件时)。 这是一段代码,显示了使用默认按钮的类似(并且希望相关)问题。 要在此处查看运行时错误,请运行代码,按下其中一个按钮,然后关闭窗口。那是我看到这个的时候:

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

【问题讨论】:

    标签: qt pyqt pyqt4 pyside


    【解决方案1】:

    在少数情况下,当我测试鼠标事件时,当事件附加到项目类时表现出更好的性能......所以不要子类化。而是:

    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 )
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      相关资源
      最近更新 更多