如果你想不关注子小部件什么的.如果您只想要主要的QWidget,请设置Children No Focus Policy;
例如,希望是有帮助的;
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_())
小部件中的当前光标,按下按键有效.
案例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_())
案例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_())
我不知道PyQt返回箭头键的ASCII是什么,但你可以避免这种情况.在pyQt中有QtCore.Qt.Key的ENUM,你可以读取类引用;
例:
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'