이벤트 필터에서 보낸 신호를 수신하는 데 문제가 있습니다. 아래의 예에서 버튼을 눌렀을 때 신호/슬롯이 잘 작동하고 포커스 아웃 필터 신호가 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_()
여기 PyQt5를 실행하는 데 동일한 문제가 있습니다. 질문 : 귀하의 예제 코드 (새로운 구문)에서'inputLineEdit1'에 연결된'focusOutFilter' 무엇입니까? 코드 스 니펫을 약간 확장 할 수 있습니까? – nostradamus
@nostradamus. 나는 나의 대답을 업데이트했다. 그러나 별도의 필터 클래스를 가질 필요는 없습니다. 'SignalOnFocus' 클래스는 정확히 같은 방식으로 그 역할을 수행 할 수 있습니다. – ekhumoro
오, 알겠습니다. 여전히 'self.inputLineEdit1.installEventFilter()'가 필요합니다. 도움이 되었어요. 정말 고마워요! – nostradamus