Python 如何通过向下箭头将焦点从QLineEdit更改为QListWidget?

Python 如何通过向下箭头将焦点从QLineEdit更改为QListWidget?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,在PyQt5中,如果我从QLineEdit按向下箭头,如何将焦点从QLineEdit更改为QListWidget?反之亦然最简单的解决方案是获取键盘事件,方法是将行编辑子类化并覆盖keyPressEvent,或者使用事件过滤器,如果按键事件是Qt.key\u Down,则设置焦点 子类别化 在本例中,我们使用一个子类和一个自定义信号,只要按下向下键,它就会发出信号,该信号连接到主类中的setFocus() class DownKeyEdit(QtWidgets.QLineEdit): d

在PyQt5中,如果我从QLineEdit按向下箭头,如何将焦点从QLineEdit更改为QListWidget?反之亦然

最简单的解决方案是获取键盘事件,方法是将行编辑子类化并覆盖
keyPressEvent
,或者使用事件过滤器,如果按键事件是
Qt.key\u 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)

注意,在这两种情况下,我都没有考虑过QualEnter的可能性,它使用箭头键来选择可能的完备性。

< P>最简单的解决方案是通过键盘类事件的子类分类和重写<代码> KyPrExeSuvie<代码>或使用事件过滤器获得键盘事件。如果按键事件是一个
Qt.key\u 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)

注意到,在这两种情况下,我都没有考虑过QualEnter的可能性,它使用箭头键来选择可能的完成。

< P>对于许多应用程序,QMnWigWET是父控件并且是子类。因此,最简单的方法之一就是覆盖keyPressed或keyReleased事件。但重要的是,在你的活动中打一个超级电话,将其释放给其他正常行为。因此,在下面的代码中,keyrease方法中的super调用允许用于切换焦点的正常选项卡功能也工作

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, 
                             QLineEdit, QListWidget)
from PyQt5.QtCore import Qt

class Main(QMainWindow):
    def __init__(self, parent=None):

        super(Main, self).__init__()

        self.lineEdit = QLineEdit(parent=self, objectName='lineEdit')
        self.lineEdit.move(50,50)
        self.listWidget = QListWidget(parent=self, objectName='listWidget')
        self.listWidget.addItem('item1')
        self.listWidget.addItem('item2')
        self.listWidget.setGeometry(50,100, 100, 100)

        self.setGeometry(300, 300, 300, 300)

    def keyReleaseEvent(self, event):
        if self.focusWidget().objectName() == 'lineEdit':
            if event.key() == Qt.Key_Down:
                self.listWidget.setFocus()
        else:
            super().keyPressEvent(event)


app = QApplication(sys.argv)
main = Main(None)

main.show()

sys.exit(app.exec_())

对于许多应用程序,QMainWidget是父窗口小部件,并且是子类的。因此,最简单的方法之一就是覆盖keyPressed或keyReleased事件。但重要的是,在你的活动中打一个超级电话,将其释放给其他正常行为。因此,在下面的代码中,keyrease方法中的super调用允许用于切换焦点的正常选项卡功能也工作

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, 
                             QLineEdit, QListWidget)
from PyQt5.QtCore import Qt

class Main(QMainWindow):
    def __init__(self, parent=None):

        super(Main, self).__init__()

        self.lineEdit = QLineEdit(parent=self, objectName='lineEdit')
        self.lineEdit.move(50,50)
        self.listWidget = QListWidget(parent=self, objectName='listWidget')
        self.listWidget.addItem('item1')
        self.listWidget.addItem('item2')
        self.listWidget.setGeometry(50,100, 100, 100)

        self.setGeometry(300, 300, 300, 300)

    def keyReleaseEvent(self, event):
        if self.focusWidget().objectName() == 'lineEdit':
            if event.key() == Qt.Key_Down:
                self.listWidget.setFocus()
        else:
            super().keyPressEvent(event)


app = QApplication(sys.argv)
main = Main(None)

main.show()

sys.exit(app.exec_())