当一个按钮被聚焦时触发一个python方法

2024-06-07 05:27:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我的pyqt5gui中有3个qpushbutton。当通过tab键选择不同的qpushbutton时,我想触发不同的方法。 这意味着当我按一次tab键(然后下一个qpushbutton(比如qpushbutton2)被聚焦)时,我想运行一个特定于qpushbutton2的函数。 有人能帮我想办法吗?你知道吗


Tags: 方法函数tab办法qpushbuttonpyqt5guiqpushbutton2
1条回答
网友
1楼 · 发布于 2024-06-07 05:27:43

我们的想法是捕捉事件的焦点,因此至少有可能的方法:

<强>1。覆盖QPushButton的focusInEvent方法

from PyQt5 import QtCore, QtWidgets


class PushButton(QtWidgets.QPushButton):
    focusSignal = QtCore.pyqtSignal()

    def focusInEvent(self, event):
        self.focusSignal.emit()
        super(PushButton, self).focusInEvent(event)


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        button1 = PushButton("button1")
        button2 = PushButton("button2")
        button3 = PushButton("button3")
        lay = QtWidgets.QVBoxLayout(self)
        for button in (button1, button2, button3):
            lay.addWidget(button)
        button1.focusSignal.connect(self.focus_button1)
        button2.focusSignal.connect(self.focus_button2)
        button3.focusSignal.connect(self.focus_button3)

    @QtCore.pyqtSlot()
    def focus_button1(self):
        print("button1")

    @QtCore.pyqtSlot()
    def focus_button2(self):
        print("button2")

    @QtCore.pyqtSlot()
    def focus_button3(self):
        print("button3")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

<强>2。使用事件过滤器

from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.button1 = QtWidgets.QPushButton("button1")
        self.button2 = QtWidgets.QPushButton("button2")
        self.button3 = QtWidgets.QPushButton("button3")
        lay = QtWidgets.QVBoxLayout(self)
        for button in (self.button1, self.button2, self.button3):
            lay.addWidget(button)
            button.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.FocusIn:
            if self.button1 is obj:
                self.focus_button1()
            elif self.button2 is obj:
                self.focus_button2()
            elif self.button3 is obj:
                self.focus_button3()
        return super(Widget, self).eventFilter(obj, event)

    def focus_button1(self):
        print("button1")

    def focus_button2(self):
        print("button2")

    def focus_button3(self):
        print("button3")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

3岁。QApplication调焦信号

from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.button1 = QtWidgets.QPushButton("button1")
        self.button2 = QtWidgets.QPushButton("button2")
        self.button3 = QtWidgets.QPushButton("button3")
        lay = QtWidgets.QVBoxLayout(self)
        for button in (self.button1, self.button2, self.button3):
            lay.addWidget(button)

        QtWidgets.qApp.focusChanged.connect(self.on_focusChanged)

    @QtCore.pyqtSlot("QWidget*", "QWidget*")
    def on_focusChanged(self, old, now):
        if now == self.button1:
            self.focus_button1()
        elif now == self.button2:
            self.focus_button2()
        elif now == self.button3:
            self.focus_button3()

    def focus_button1(self):
        print("button1")

    def focus_button2(self):
        print("button2")

    def focus_button3(self):
        print("button3")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

相关问题 更多 >