dwa*_*son 4 python pyqt4 arrow-keys
我正在尝试编写一个(当前非常简单的)PyQt应用程序,并希望允许用户使用箭头键进行导航,而不是单击按钮。
我已经实现了基础,在我的main中QWidget,我重写了keyPressEvent,现在,我所要问的是它会引发警报(QMessageBox.information(self, "Hey", "pressed:{}".format(event), QMessageBox.Ok))。
这对于标准ASCII键(例如字母和Enter键)非常有效,但是当我按下箭头键时它完全被忽略了,我一生都无法找出原因。
我一部分人想知道键盘上是否还有其他问题,因为我在没有数字键盘的笔记本电脑上(这是一台带有标准常规ASCII键盘的HP,右箭头键下方有四个箭头键,没有数字键盘)。
有什么建议或帮助吗?我可以根据需要发布代码,但是由于keyPressEvent其他所有键都可以使用,因此我不确定它会增加什么。
如果您不想让子窗口小部件什么都集中。如果只希望主要QWidget,请设置“儿童不关注策略”;
例如,希望是有帮助的;
import sys
from PyQt4 import QtGui, QtCore
class QCustomWidget (QtGui.QWidget):
def __init__ (self, parent = None):
super(QCustomWidget, self).__init__(parent)
myQLayout = QtGui.QVBoxLayout()
self.my1QPushButton = QtGui.QPushButton('Test 1', self)
self.my2QPushButton = QtGui.QPushButton('Test 2', self)
self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)
myQLayout.addWidget(self.my1QPushButton)
myQLayout.addWidget(self.my2QPushButton)
self.setLayout(myQLayout)
def setChildrenFocusPolicy (self, policy):
def recursiveSetChildFocusPolicy (parentQWidget):
for childQWidget in parentQWidget.findChildren(QtGui.QWidget):
childQWidget.setFocusPolicy(policy)
recursiveSetChildFocusPolicy(childQWidget)
recursiveSetChildFocusPolicy(self)
def keyPressEvent (self, eventQKeyEvent):
messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Main', QtGui.QMessageBox.Yes)
messageQMessageBox.exec_()
QtGui.QWidget.keyPressEvent(self, eventQKeyEvent)
appQApplication = QtGui.QApplication(sys.argv)
windowQCustomWidget = QCustomWidget()
windowQCustomWidget.setFixedSize(640, 480)
windowQCustomWidget.show()
sys.exit(appQApplication.exec_())
Run Code Online (Sandbox Code Playgroud)
QWidget.setFocusPolicy(自己,Qt.FocusPolicy策略)参考
窗口小部件中的当前光标,按下该键即可生效。
情况1:纯粹QWidget:在这种情况下,由于专注于自身,它可以跟踪所有关键QWidget。
import sys
from PyQt4 import QtGui, QtCore
class QCustomWidget (QtGui.QWidget):
def __init__ (self, parent = None):
super(QCustomWidget, self).__init__(parent)
myQLayout = QtGui.QVBoxLayout()
self.setLayout(myQLayout)
def keyPressEvent (self, eventQKeyEvent):
messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello', QtGui.QMessageBox.Yes)
messageQMessageBox.exec_()
QtGui.QWidget.keyPressEvent(self, eventQKeyEvent)
appQApplication = QtGui.QApplication(sys.argv)
windowQCustomWidget = QCustomWidget()
windowQCustomWidget.setFixedSize(640, 480)
windowQCustomWidget.show()
sys.exit(appQApplication.exec_())
Run Code Online (Sandbox Code Playgroud)
情况2:添加按钮QWidget:此情况无法跟踪箭头键,因为它的焦点按钮和箭头键已用于设置新的焦点位置。(如果您在linux中使用Windows风格,则可以看到焦点网格)
import sys
from PyQt4 import QtGui, QtCore
class QCustomWidget (QtGui.QWidget):
def __init__ (self, parent = None):
super(QCustomWidget, self).__init__(parent)
myQLayout = QtGui.QVBoxLayout()
self.my1QPushButton = QtGui.QPushButton('Test 1', self)
self.my2QPushButton = QtGui.QPushButton('Test 2', self)
myQLayout.addWidget(self.my1QPushButton)
myQLayout.addWidget(self.my2QPushButton)
self.my1QPushButton.keyPressEvent = self.button1KeyPressEvent
self.my2QPushButton.keyPressEvent = self.button2KeyPressEvent
self.setLayout(myQLayout)
def keyPressEvent (self, eventQKeyEvent):
messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Main', QtGui.QMessageBox.Yes)
messageQMessageBox.exec_()
QtGui.QWidget.keyPressEvent(self, eventQKeyEvent)
def button1KeyPressEvent (self, eventQKeyEvent):
messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Button 1', QtGui.QMessageBox.Yes)
messageQMessageBox.exec_()
QtGui.QPushButton.keyPressEvent(self.my1QPushButton, eventQKeyEvent)
def button2KeyPressEvent (self, eventQKeyEvent):
messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Button 2', QtGui.QMessageBox.Yes)
messageQMessageBox.exec_()
QtGui.QPushButton.keyPressEvent(self.my2QPushButton, eventQKeyEvent)
appQApplication = QtGui.QApplication(sys.argv)
windowQCustomWidget = QCustomWidget()
windowQCustomWidget.setFixedSize(640, 480)
windowQCustomWidget.show()
sys.exit(appQApplication.exec_())
Run Code Online (Sandbox Code Playgroud)
我不知道PyQt返回的箭头键的ASCII是什么,但是您可以避免这种情况。pyQt中的ENUM为QtCore.Qt.Key,您可以阅读类参考;
例:
def keyPressEvent (self, eventQKeyEvent):
key = eventQKeyEvent.key()
if key == QtCore.Qt.Key_F1:
print 'Help'
elif key == QtCore.Qt.Key_F5:
print 'Reload'
elif key == QtCore.Qt.Key_Left:
print 'Left'
elif key == QtCore.Qt.Key_Up:
print 'Up'
elif key == QtCore.Qt.Key_Right:
print 'Right'
elif key == QtCore.Qt.Key_Down:
print 'Down'
Run Code Online (Sandbox Code Playgroud)
另请参阅:Qt.Key枚举参考