原帖出自http://blog.sina.com.cn/yjcx2010
键盘事件被频繁处理。例如,按下F1,显示帮助信息;在文本编辑框中,按下回车键,输入焦点自动跳到另一控件。下面详细介绍键盘事件。
- setFocus([reason]) - 如果控件在活动窗口中,调用此方法后,该控件成为输入焦点。reason参数可为QtCore.Qt类中的以下枚举变量:
-
- MouseFocusReason(0):使用鼠标获得焦点;
- TabFocusReason(1):按下了键;
- BacktabFocusReason(2):按下了+组合键;
- ActiveWindowFocusReason(3):窗口变为活动和非活动;
- PopupFocusReason(4):打开或关闭弹出窗口;
- ShortcutFocusReason(5):按下快捷键;
- MenuBarFocusReason(6):通过菜单操作;
- OtherFocusReaaon(7):其他方式。
- clearFocus() - 去除输入焦点;
- hasFocus() - 如果控件是输入焦点,返回True;否则,返回False;
- focusWidget() - 返回最后调用setFocus()方法的控件对象;
- setFocusProxy() - 指定获得输入焦点的控件对象;
- focusProxy() - 返回获得非当前控件的输入焦点的控件对象;
- focusNextChild() - 找到下一个可获得输入焦点的控件对象,并设置为输入焦点。相当于按了键。如果有此控件,返回True;否则,返回False;
- focusPreviousChild() - 找到上一个可获得输入焦点的控件对象,并设置为输入焦点。相当于按了+键。如果有此控件,返回True;否则,返回False;
- focusNextPrevChild() -
如果isnext参数为True,功能相当于focusNextChild();如果isnext参数为False,功能相当于focusPreviousChild(); - setTabOrder(,) - 静态函数。用于指定按下键时,输入焦点的移动顺序。component2是当输入焦点在component1是按下键后的输入焦点所在的控件。如果有多个控件,则需要调用多次。例如,指定输入焦点在按下键的变化顺序为widget1->widget2->widget3->widget4,相应的代码为:
QtWidgets.QWidget.setTabOrder(widget1,widget2)
QtWidgets.QWidget.setTabOrder(widget2,widget3)
QtWidgets.QWidget.setTabOrder(widget3,widget4) - setFocusPolicy () - 指定控件如何获得输入焦点。Method可以QtCore.Qt类以一的枚举对象:
-
- nofocus(0):不能获得输入焦点;
- TabFocus(1):用键获得;
- ClickFocus(2):用点击鼠标获得;
- strongFocus(11):用键和点击鼠标获得;
- wheelFocus(15):用键、点击鼠标和滚轮获得;
- focusPolicy():返回当前获得输入焦点的方式;
- grabKeyboard():限定键盘输入。在调用releaseKeyboard()之前,其他控件无法获得输入焦点;
- releaseKeyboard():释放之前所作的键盘输入限定。
- focusInEvent(self, event) - 获得焦点时被调用;
- focusOutEvent(self,even) - 失去焦点时被调用;
- gotFocus() - 如果event的类型为QEvent.FocusIn,返回True,否则,返回False;
- lostFocus()
- 如果event的类型为QEvent.FocusOut,返回True,否则,返回False; - reason() - 返回设置输入焦点的原因。
下面的代码为:
# -*- coding: utf-8 -*-
from PyQt5 import QtWidgets
class MyLineEdit(QtWidgets.QLineEdit):
class MyWindow(QtWidgets.QWidget):
if __name__ == "__main__":
- grabShortcut (Keys [,Context]) - 登记快捷键,返回一个标识符。参数Keys为QKeySequence对象。设置+快捷键的Keys设置方式为:
-
- QtQui.QKeySequence.mmemonic("&e")
- QtGui.QKeySequence("Alt+e")
- QtGui.QKeySequence(QtCore.Qt.ALT + QtCore.Qt.Key_E)
- releaseshortcut (ID) - 删除标识符为ID的组合键;
- setShortcutEnabled(ID[,Flag]) -
Flag为True时,标识符为ID的组合键有效;否则,无效。
- shortcutId():返回快捷键的标识符。
- isAmbiguous():如果事件同时发送给几个控件,返回True;否则,返回Fasle.
- key():返回代表所按下快捷键的QkeySequence对象。
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class MyLineEdit(QtWidgets.QLineEdit):
class MyWindow(QtWidgets.QWidget):
if __name__ == "__main__":
self.lineEdit2 = QtWidgets.QLineEdit()
self.shc = QtWidgets.QShortcut(QtGui.QKeySequence.mnemonic("&D"), self)
self.shc.setContext(QtCore.Qt.WindowShortcut)
self.shc.activated.connect(self.lineEdit2.setFocus)
self.lineEdit2 = QtWidgets.QLineEdit()
self.act = QtWidgets.QAction(self)
self.act.setShortcut(QtGui.QKeySequence.mnemonic("&е"))
self.act.triggered.connect(self.lineEdit2.setFocus)
self.addAction(self.act)
- keyPressEvent(self,event) - 按下某一键时,该方法被调用直到键被释放为止;
- keyReleaseEvent(self,event) - 释放之前按下的键时被调用。event参数为QKeyEvent对象,包括事件的相关信息,有以下方法可调用。(详见QKeyEvent文档http://doc.qt.io/qt-5/qkeyevent.html)
- key():返回按下键的值;
- text():返回按下键的Unicode字符编码信息,当按键为Shift, Control, Alt等时,则该函数返回的字符为空值;
- modifiers():判断按下了哪些修饰键(Shift,Ctrl , Alt,等等)。返回值为QtCore.Qt 类以下枚举变量的组合:
-
- NoModifier - 没有修饰键;
- ShiftModifier - 修饰键;
- ControlModifier - 修饰键;
- AltModifier - 修饰键;
- MetaModifier - 修饰键;
- KeypadModifier - 附加键盘上的任何按键;
- GroupSwitchModifier - 按下键(仅限X11系统)。
- isAutoRepeat(): 如果一直按着某键,返回True;否则,返回False;
- match(QKeySequence.StandardKey key): 如果当前的键组合与key相同,返回True;否则,返回False. 比如,是否按下了复制快捷键的代码:
if e.matches(QtGui.QKeySequence.Copy):
print("组合键为 +")
- 控件必须可以设置为输入焦点。有些控件,如QLabel是不能接受输入焦点的。
- 捕获键盘事件要使用grabKeyboard( )方法,释放时,调用rekeaseKeyboard().
- 可能拦截除和+以外的任何键。要拦截这两个键,只能在event(self,event)中完成。
- 如果要让父控件继续收到键盘事件,要调用事件的ignore()方法;否则,调用accept()。