我们如何通过Down_arrow将焦点从QLineEdit更改为QListWidget?

问题描述 投票:0回答:2

在PyQt5中,如果我从QLineEdit按向下箭头,如何将焦点从QLineEdit更改为QListWidget?副Versa

python pyqt pyqt5
2个回答
1
投票

最简单的解决方案是通过将行编辑子类化并覆盖keyPressEvent或使用事件过滤器来获取键盘事件,如果键事件是Qt.Key_Down,则设置焦点。

子类化

在这种情况下,我们使用一个子类和一个自定义信号,每当按下向下键时,它就会发出与主类中的setFocus()连接的信号。

class DownKeyEdit(QtWidgets.QLineEdit):
    downKeyPressed = QtCore.pyqtSignal()
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Down:
            self.downKeyPressed.emit()
            event.accept()
        else:
            super().keyPressEvent(event)


class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)
        self.lineEdit = DownKeyEdit()
        layout.addWidget(self.lineEdit)
        self.listWidget = QtWidgets.QListWidget()
        layout.addWidget(self.listWidget)
        self.listWidget.addItems(['Item {}'.format(i + 1) for i in range(10)])

        self.lineEdit.downKeyPressed.connect(self.listWidget.setFocus)

事件过滤

使用事件过滤器可以避免不必要的子类化,因为我们仅在特定情况下才需要它。我们过滤键事件并检查键是否正确,然后相应地设置焦点。

class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)
        self.lineEdit = QtWidgets.QLineEdit()
        layout.addWidget(self.lineEdit)
        self.listWidget = QtWidgets.QListWidget()
        layout.addWidget(self.listWidget)
        self.listWidget.addItems(['Item {}'.format(i + 1) for i in range(10)])

        self.lineEdit.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.KeyPress and event.key() == QtCore.Qt.Key_Down:
            self.listWidget.setFocus()
            event.accept()
        return super().eventFilter(source, event)

请注意,在两种情况下,我都没有考虑使用箭头键选择可能的补全的QCompleter的可能性。


0
投票

对于许多应用程序,QMainWidget是父窗口小部件,并且是子类。因此,最简单的操作之一就是覆盖keyPressed或keyReleased事件。但是在您的事件中进行超级调用以将其释放为其他正常行为很重要。因此,在下面的代码中,keyRelease方法中的超级调用允许正常的制表符功能切换焦点也可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.