2012-06-18 6 views
3

나는 수많은 사용자 정의 버튼이있는 응용 프로그램을 가지고 있습니다. 각 응용 프로그램에는 다중 신호 연결이 필요합니다. 연결 호출은 꽤 느린 것 같습니다. 그래서 입력/종료 이벤트를 사용하여 메인 윈도우의 eventFilter을 통해 각 버튼의 신호를 연결/연결 해제하려고합니다.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_()) 

답변

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) 

... 클래스에 대한 마우스 이벤트를 정의하십시오.