Python 带有eventFilter的PyQt4信号和插槽
我在接收事件过滤器发送的信号时遇到问题。在下面的示例中,按钮按下的信号/插槽工作正常,调焦滤波器信号发出OK。然而,调焦输出信号没有被截获,插槽也不会发射。知道我做错了什么吗Python 带有eventFilter的PyQt4信号和插槽,python,event-handling,pyqt,pyqt4,signals-slots,Python,Event Handling,Pyqt,Pyqt4,Signals Slots,我在接收事件过滤器发送的信号时遇到问题。在下面的示例中,按钮按下的信号/插槽工作正常,调焦滤波器信号发出OK。然而,调焦输出信号没有被截获,插槽也不会发射。知道我做错了什么吗 from PyQt4.QtCore import SIGNAL, QObject, QEvent from PyQt4.QtGui import QApplication, QLabel, QWidget, QLineEdit, QPushButton, QTextEdit, QVBoxLayout class Sign
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_()
过滤器对象正在发射信号,因此在连接它们时需要指定:
self.connect(self.focusOutFilter, SIGNAL("focus_out"), self.focusLost)
...
self.connect(self.mousePressedFilter, SIGNAL("mouse_clicked"), self.mouseClicked)
<>但是请认真考虑摆脱那种丑陋的、老式的连接信号的语法。对Qt4的官方支持今年即将结束,PyQt5已经使旧式语法完全过时
使用,您的示例如下所示:
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()
我希望你会同意这一点,它看起来更具可读性(也更容易理解)
(还要注意,如果您将Python 3与PyQt一起使用,默认情况下,任何返回
QString
的Qt方法都是-因此您不需要使用str
自己对其进行转换。)过滤器对象发出信号,因此在连接它们时需要指定:
self.connect(self.focusOutFilter, SIGNAL("focus_out"), self.focusLost)
...
self.connect(self.mousePressedFilter, SIGNAL("mouse_clicked"), self.mouseClicked)
<>但是请认真考虑摆脱那种丑陋的、老式的连接信号的语法。对Qt4的官方支持今年即将结束,PyQt5已经使旧式语法完全过时
使用,您的示例如下所示:
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()
我希望你会同意这一点,它看起来更具可读性(也更容易理解)
(还请注意,如果您将Python 3与PyQt一起使用,默认情况下,任何返回
QString
的Qt方法都是-因此您不需要使用str
自己对其进行转换。)我在运行PyQt5时也遇到了同样的问题。问题:在示例代码(新语法)中,focusOutFilter
连接到inputLineEdit1
?你能稍微扩展一下你的代码片段吗?@nostradamus。我已经更新了我的答案。但是请注意,实际上并不需要有一个单独的过滤器类。SignalOnFocus
类可以以完全相同的方式执行该角色。哦,我明白了,我们仍然需要self.inputLineEdit1.installEventFilter()
。这很有帮助,非常感谢!我在运行PyQt5时遇到了同样的问题。问题:在示例代码(新语法)中,focusOutFilter
连接到inputLineEdit1
?你能稍微扩展一下你的代码片段吗?@nostradamus。我已经更新了我的答案。但是请注意,实际上并不需要有一个单独的过滤器类。SignalOnFocus
类可以以完全相同的方式执行该角色。哦,我明白了,我们仍然需要self.inputLineEdit1.installEventFilter()
。这很有帮助,非常感谢!