[英]How to Change the Focus from QListWidget to QLineEdit, If I press only any Alphabets (A-Z, a-z) or numbers(0 - 9)?
[英]How we Change focus from QLineEdit to QListWidget by Down_arrow?
在 PyQt5 中,如果我从 QLineEdit 按向下箭头,如何将焦点从 QLineEdit 更改为 QListWidget? 反之亦然
最简单的解决方案是获取键盘事件,方法是继承行编辑并覆盖keyPressEvent
或使用事件过滤器,如果键事件是Qt.Key_Down
,则设置焦点。
在这种情况下,我们使用一个子类和一个自定义信号,只要按下向下键,它就会发出信号,该信号连接到主 class 中的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 的可能性,它使用箭头键 select 可能的完成。
对于许多应用程序,QMainWidget 是父小部件并且是子类。 所以最简单的事情之一就是覆盖 keyPressed 或 keyReleased 事件。 但重要的是在您的事件中进行超级调用以将其释放到其他正常行为。 所以在下面的代码中,keyRelease 方法中的 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_())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.