2015-01-02 4 views
0

이벤트 필터에서 보낸 신호를 수신하는 데 문제가 있습니다. 아래의 예에서 버튼을 눌렀을 때 신호/슬롯이 잘 작동하고 포커스 아웃 필터 신호가 OK가됩니다. 그러나 초점 신호는 가로 챌 수없고 슬롯은 작동하지 않습니다. 내가 뭘 잘못하고 있는거야?eventQilter와 함께 PyQt4 신호 및 슬롯

self.connect(self.focusOutFilter, SIGNAL("focus_out"), self.focusLost) 
    ... 
    self.connect(self.mousePressedFilter, SIGNAL("mouse_clicked"), self.mouseClicked) 

하지만 심각 연결 못생긴, 이전 스타일 구문을 제거하기 고려하시기 바랍니다 : 그건 당신이 그들을 연결할 때 지정해야 할 것입니다, 그래서

from PyQt4.QtCore import SIGNAL, QObject, QEvent 
from PyQt4.QtGui import QApplication, QLabel, QWidget, QLineEdit, QPushButton, QTextEdit, QVBoxLayout 

class SignalOnFocus(QWidget): 
    def __init__(self): 
     super(SignalOnFocus, self).__init__() 
     layout = QVBoxLayout() 
     self.label = QLabel("Type in some text then push button") 
     self.inputLineEdit1 = QLineEdit() 
     self.inputLineEdit1.setObjectName("inputLineEdit1") 

     self.focusOutFilter = FocusOutFilter() 
     self.inputLineEdit1.installEventFilter(self.focusOutFilter) 
     self.connect(self.inputLineEdit1, SIGNAL("focus_out"), 
       self.focusLost) 
     self.inputLineEdit2 = QLineEdit() 
     self.inputLineEdit2.setObjectName("inputLineEdit2") 
     self.mousePressedFilter = MousePressedFilter() 
     self.inputLineEdit2.installEventFilter(self.mousePressedFilter) 
     self.connect(self.inputLineEdit2, SIGNAL("mouse_clicked"), self.mouseClicked) 
     self.button1 = QPushButton("Press me") 
     self.button1.setObjectName("button1") 
     self.connect(self.button1, SIGNAL("clicked()"), self.buttonPressed) 
     self.textEdit = QTextEdit() 
     layout.addWidget(self.label) 
     layout.addWidget(self.inputLineEdit1) 
     layout.addWidget(self.inputLineEdit2) 
     layout.addWidget(self.button1) 
     layout.addWidget(self.textEdit) 
     self.setLayout(layout) 

    def mouseClicked(self): 
     self.textEdit.append(" mouse clicked") 

    def buttonPressed(self): 
     self.textEdit.append(" button pressed") 

    def focusLost(self): 
     self.textEdit.append(" focus_out") 

class MousePressedFilter(QObject): 
    def eventFilter(self, widget, event): 
     if event.type() == QEvent.MouseButtonPress: 
      print("--eventFilter() mouse_clicked on "+str(widget.objectName())) 
      self.emit(SIGNAL("mouse_clicked")) 
      return False 
     else: 
      return False 

class FocusOutFilter(QObject): 
    def eventFilter(self, widget, event): 
     if event.type() == QEvent.FocusOut: 
      print("--eventFilter() focus_out on "+str(widget.objectName())) 
      self.emit(SIGNAL("focus_out")) 
      return False 
     else: 
      return False 

if __name__ == "__main__": 
    app = QApplication([]) 
    form = SignalOnFocus() 
    form.show() 
    app.exec_() 

답변

6

필터 객체는 신호를 방출된다 신호. 올해 Qt4에 대한 공식적인 지원이 끝나고 PyQt5는 구식 구문을 완전히 쓸모 없게 만들었습니다.

new-style syntax를 사용하여, 당신의 예는 다음과 같을 것이다 : 나는 당신이 동의 바랍니다

from PyQt4.QtCore import pyqtSignal, QObject, QEvent 

class SignalOnFocus(QWidget): 
    def __init__(self): 
     ...  
     self.focusOutFilter = FocusOutFilter() 
     self.inputLineEdit1.installEventFilter(self.focusOutFilter) 
     self.focusOutFilter.focusOut.connect(self.focusLost) 

class FocusOutFilter(QObject): 
    focusOut = pyqtSignal() 

    def eventFilter(self, widget, event): 
     if event.type() == QEvent.FocusOut: 
      print("--eventFilter() focus_out on " + widget.objectName()) 
      self.focusOut.emit() 

(오른쪽 얻을 쉽게) 훨씬 더 읽기 보인다.

는 (- 그래서 당신은 str를 사용하여 직접 변환 할 필요가 없습니다 또한 기본적으로 PyQt는 파이썬 3를 사용하는 경우 QString을 반환하는 모든 Qt는 방법은 automatically converted to a python string이다).

+0

여기 PyQt5를 실행하는 데 동일한 문제가 있습니다. 질문 : 귀하의 예제 코드 (새로운 구문)에서'inputLineEdit1'에 연결된'focusOutFilter' 무엇입니까? 코드 스 니펫을 약간 확장 할 수 있습니까? – nostradamus

+0

@nostradamus. 나는 나의 대답을 업데이트했다. 그러나 별도의 필터 클래스를 가질 필요는 없습니다. 'SignalOnFocus' 클래스는 정확히 같은 방식으로 그 역할을 수행 할 수 있습니다. – ekhumoro

+0

오, 알겠습니다. 여전히 'self.inputLineEdit1.installEventFilter()'가 필요합니다. 도움이 되었어요. 정말 고마워요! – nostradamus