首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt4信号和eventFilter插槽

PyQt4信号和eventFilter插槽
EN

Stack Overflow用户
提问于 2015-01-02 21:43:41
回答 1查看 2.4K关注 0票数 0

我在接收来自事件过滤器的信号时遇到了困难。在下面的示例中,按下的信号/插槽很好地工作,焦点输出滤波器信号发出OK。然而,焦点输出信号并没有被截获,插槽也没有被触发。知道我做错了什么吗?

代码语言:javascript
复制
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_()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-03 00:13:24

筛选器对象发出信号,因此在连接它们时需要指定这些信号:

代码语言:javascript
复制
    self.connect(self.focusOutFilter, SIGNAL("focus_out"), self.focusLost)
    ...
    self.connect(self.mousePressedFilter, SIGNAL("mouse_clicked"), self.mouseClicked)

但是,请认真考虑消除那种丑陋的,老式的连接信号的语法。官方对Qt4的支持今年即将结束,PyQt5已经使旧的语法完全过时了。

使用新型语法,您的示例如下所示:

代码语言:javascript
复制
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()

我希望你会同意,看上去更易读(也更容易理解)。

(还请注意,如果您在PyQt中使用Python3,默认情况下,任何返回QString的Qt方法都是自动转换为python字符串,因此不需要自己使用str来转换它)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27748932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档