如何在PyQt中知道哪个QWidget在UI表单中获得了焦点

3

我对PyQt还不熟悉。我在QtDeveloper中设计了一个表单,其中包含三个控件:一个按钮、一个组合框和一个行编辑器。在我的UI表单中,行编辑器的名称是myLineEdit。我想知道哪个QWidget获得了焦点(QLineEdit还是QComboBox)。我实现了从互联网上获取的代码。当代码运行时,会创建一个独立的行编辑器并且它可以正常工作。但是我想将focusInEvent授予在.ui表单中创建的myLineEdit小部件。以下是我的代码,请帮忙。

class MyLineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(MyLineEdit, self).__init__(parent)
    def focusInEvent(self, event):
        print 'focus in event'
        self.clear()
        QLineEdit.focusInEvent(self, QFocusEvent(QEvent.FocusIn))

class MainWindow(QtGui.QMainWindow,Ui_MainWindow):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.myLineEdit = MyLineEdit(self)
1个回答

8
你必须实现eventFilter方法,并将此属性启用于所需的小部件:
{your widget}.installEventFilter(self)

eventFilter方法包含对象和事件类型的信息。

例子

import sys
from PyQt5 import uic
from PyQt5.QtCore import QEvent
from PyQt5.QtWidgets import QApplication, QWidget

uiFile = "widget.ui"  # Enter file here.

Ui_Widget, _ = uic.loadUiType(uiFile)


class Widget(QWidget, Ui_Widget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent=parent)
        self.setupUi(self)
        self.lineEdit.installEventFilter(self)
        self.pushButton.installEventFilter(self)
        self.comboBox.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QEvent.FocusIn:
            if obj == self.lineEdit:
                print("lineedit")
            elif obj == self.pushButton:
                print("pushbutton")
            elif obj == self.comboBox:
                print("combobox")
        return super(Widget, self).eventFilter(obj, event)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

在这里输入图片描述

输出:

lineedit
pushbutton
combobox
pushbutton
lineedit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接