键盘事件包括哪几种(c语言键盘事件)

在GUI桌面应用程序中,用户与程序的交互一般是通过键盘和鼠标来完成的,处理与键盘和鼠标相关的事件几乎是GUI程序不可缺少的一部分。下面介绍Qt中处理输入焦点和键

键盘事件包括哪几种(c语言键盘事件)

在GUI桌面应用程序中,用户与程序的交互一般是通过键盘和鼠标来完成的,处理与键盘和鼠标相关的事件几乎是GUI程序不可缺少的一部分。下面介绍Qt中处理输入焦点和键盘事件的相关知识。

设置控件的输入焦点

在一个窗口中,通常有多个控件。如果控件想要获取键盘输入信息,它必须将输入焦点设置到控件上。在窗口中,一次只有一个(或没有)控件可以获得输入焦点。您可以使用QWidget的以下方法来操作控件的输入焦点。

setFocus([reason]):- 如果控件在活动窗口中,调用此方法后,该控件成为输入焦点。reason参数可为Qt.FoucsReason中的以下枚举变量。MouseFocusReason (0): 使用鼠标获得焦点;TabFocusReason (1): 按下了Tab键;BacktabFocusReason (2): 按下了组合键+Tab键,组合键包括Shift或Control, 例如Shift+Tab;ActiveWindowFocusReason (3): 窗口变为活动和非活动;PopupFocusReason (4): 打开或关闭弹出窗口;ShortcutFocusReason (5): 按下快捷键;MenuBarFocusReason (6): 通过菜单操作;OtherFocusReaaon (7): 其他方式。clearFocus(): 清除输入焦点;hasFocus(): 如果控件是输入焦点,返回True;否则,返回False;focusWidget(): 返回最后调用setFocus()方法的控件对象;setFocusProxy(): 指定获得输入焦点的控件对象;focusProxy(): 返回获得非当前控件的输入焦点的控件对象;focusNextChild(): 找到下一个可获得输入焦点的控件对象,并设置为输入焦点。相当于按了Tab键。如果有此控件,返回True;否则,返回False;focusPreviousChild(): 找到上一个可获得输入焦点的控件对象,并设置为输入焦点。相当于按了Shift+Tab键。如果有此控件,返回True;否则,返回False;focusNextPrevChild(): 如果isnext参数为True,功能相当于focusNextChild();如果isnext参数为False,功能相当于focusPreviousChild();setTabOrder(,) - 静态函数。用于指定按下键时,输入焦点的移动顺序。component2是当输入焦点在component1是按下键后的输入焦点所在的控件。如果有多个控件,则需要调用多次。例如,指定输入焦点在按下键的变化顺序为widget1->widget2->widget3->widget4,相应的代码为:

Qwidget.settaborder (Widget1,widget 2)q widget . setta border(widget 2,widget 3)q widget . setta border(widget 3,Widget4) setFocus Policy():指定控件如何设置输入焦点。方法可以枚举Qt中的以下变量。FocusPolicy: NoFocus:无法设置输入焦点;TabFocus:用Tab键设置输入焦点;ClickFocus:点击鼠标设置输入焦点;StrongFocus:使用Tab键并单击鼠标来设置焦点;使用Tab键,点击鼠标和滚轮来设置焦点。FocusPolicy():返回获取输入焦点的当前方式;GrabKeyboard():限制键盘输入。在调用releaseKeyboard()之前,其他控件无法获得输入焦点;ReleaseKeyboard():释放之前做的键盘输入限制。QApp类的静态方法focusWidget()返回具有键盘输入焦点的QApplication的顶层窗口。如果没有,则返回None。

QWidget类的下列方法可用于处理焦点事件:

focusInEvent(self, event) - 获得焦点时被调用;focusOutEvent(self,even) - 失去焦点时被调用。

上述函数中的事件参数是QDocuEvent类的一个实例,有以下方法可以获取焦点事件的相关信息:

gotFocus(): 如果event的类型为QEvent.FocusIn,返回True,否则,返回False;lostFocus(): 如果event的类型为QEvent.FocusOut,返回True,否则,返回False;reason(): 返回设置输入焦点的原因。焦点设置测试

在测试代码中,我们创建了一个带有一个QPushButton按钮和两个QLineEdit单行编辑的窗口。对于单行编辑框,处理获得和失去输入焦点的事件。通过按下按钮,我们将输入焦点设置到第二个单行编辑框。此外,焦点可以通过Tab键向前切换,或者通过S shift+Tab向后切换。完整的代码如下:

importsysfromPyQt5importQtCore,QtGui,QtWidgetsfromPyQt5。qtcoreimportqtfrompyqt 5 . qtwidgetimport(QA application,QMainWindow,QWidget,QLineEdit,Qbushbutton,qvboxlayout,qformlayout)classmylineedit(qline edit):def _ _ init _ _(self,id,parent = none): super (mylineedit,self)。_ _ init _ _(父)自身。ID = ID #焦点入口事件deffocinevent (self)。输入焦点是:& # 39;,自我。id) qlineedit。Focus in event (self,evt) # DefFocus OutEvent (self,evt): print (self。id,& # 39;:失去输入焦点& # 39;)qlineedit。focuseoutevent (self,evt)classfocusetdemo(qmainwindow):def _ _ init _(self,parent = none): super (focusetdemo,self)。_ _ init _ _ (parent) #设置窗口标题self . setwindowtitle(& # 39;实战PyQt5:焦点设置演示& # 39;)#自行设置窗口大小。调整自身大小(300,200)。init UI()Define UI(self):main widget = q widget()main layout = qvboxlayout()main layout。设置间距(10)btnchangefocus = q push button(& # 39;将焦点设置到编辑框2 & # 39;)btnchangefocus . clicked . connect(self . onbuttonchangefocus)self . line edit 1 = myline edit(1)self . line edit 2 = myline edit(2)fLayout = QFormLayout()fLayout . addrow(& # 39;编辑框1 & # 39;,self . lineedit 1)flayout . addrow(& # 39;编辑框2 & # 39;,self . line edit 2)main layout . add widget(btnChangeFocus)main layout . add layout(Fla yout)main widget . set layout(main layout)self . setcentralwidget(main widget)defonButtonChangeFocus(self):self . line edit 2 . set focus()if _ _ name _ _ = = & # 39;_ _ main _ _ & # 39:app = QA replication(sys . argv)window = focused emo()window . show()sys . exit(app . exec())运行结果如下:

快捷键设置快捷键(也称为热键)是GUI程序交互操作的一个常用功能。在一个GUI应用的系统菜单中,我们经常可以看到菜单项都有相应的快捷操作。快捷键用于快速设置输入焦点。要设置快捷方式,您可以在相应的字母后添加“&”。程序运行后,会在相应的字母下画线提醒用户。按Alt+带下划线的字母,相应的控件就可以获得输入焦点,执行相应的动作。

对于编辑框等没有文本的控件,在设置快捷键时,可以通过调用setBuddy(component)创建一个QLabel对象并将其与控件关联。如果没有创建QLabel对象,可以使用QWidget的以下方法来设置和管理快捷键:

grabShortcut (keys [,context]): 登记快捷键,返回一个标识符。参数keys为QtGui.QKeySequence对象。设置控制键+快捷键的Keys设置方式为:QKeySequence.mnemonic("&e")QKeySequence("Alt+e")QKeySequence(QtCore.Qt.ALT + QtCore.Qt.Key_E)

上下文参数可以是Qt中的枚举变量。ShortcutContext: WidgetShortcut、WidgetWithChildrenShortcut、WindowsShortcut(默认)和ApplicationShortcut。

releaseshortcut (id) - 删除标识符为id的组合键;setShortcutEnabled(id [,flag]): flag为True时,标识符为id的组合键有效;否则无效。

当快捷键被按下时,一个事件。生成快捷方式事件,可以在函数事件(self,event)中处理。事件参数是QShortcutEvent对象,有以下方法:

shortcutId(): 返回快捷键的标识符;isAmbiguous(): 如果事件同时发送给几个控件,返回True;否则,返回Fasle;key():返回代表所按下快捷键的QkeySequence对象。快捷键设置测试

测试代码演示了直接为按钮设置快捷键,使用QLabel.setBuddy()方法为编辑框1和QWidget设置快捷键。为编辑框2设置快捷键。完整的演示代码如下:

importsysfromPyQt5importQtCore,QtGui,QtWidgetsfromPyQt5。QtCoreimportQt,QEventfromPyQt5。qtguiimport qkeysequencefrompyqt 5 . QtWidgetsimport(QA application,QMainWindow,QWidget,QLabel,QLineEdit,QPushButton,QVBoxLayout,QFormLayout)classMyLineEdit(qline edit):def _ _ init _ _(self,parent=None):super(MyLineEdit,self)。_ _ init _ _(parent)self . id = nonedevent(self,evt):ifevt.type()==QEvent。快捷方式:if self . id = = evt . short cutid():self . setfocus(Qt。ShortcutFocusReason)returntrue returnqlineedit . event(self,Evt)classfocussetdemo(qmainwindow):def _ _ init _ _(self,parent = none):super(focussetdemo,self)。_ _ init _ _ (parent) #设置窗口标题self . setwindowtitle(& # 39;实战PyQt5:快捷键设置演示& # 39;)#自行设置窗口大小。调整自身大小(360,240)。init UI()Define UI(self):main widget = q widget()main layout = qvboxlayout()main layout。设置间距(10)btnclearfocus = q button(& # 39;(&R)清除编辑框1的输入焦点& # 39;)btnclearfocus . clicked . connect(self . onbuttonclearfocus)label 1 = q label(& # 39;&编辑框1 & # 39;)self . line edit 1 = myline edit()self . line edit 1 . settext(& # 39;test1 & # 39)label 1 . set buddy(self . line edit 1)self . line edit 2 = myline edit()self . line edit 2 . settext(& # 39;测试2 & # 39;)self . lineedit 2 . id = self . lineedit 2 . grab shortcut(qkey sequence . mnemonic(& # 39;& D & # 39))fLayout = QFormLayout()fLayout . addrow(label 1,self . lineedit 1)fLayout . addrow(& # 39;编辑框2 & # 39;,self . line edit 2)main layout . add widget(btnClearFocus)main layout . add layout(fLayout)main widget . set layout(main layout)self . setcentralwidget(main widget)defonButtonClearFocus(self):self . line edit 1 . clearfocus()if _ _ name _ _ = = & # 39;_ _ main _ _ & # 39:app = QA replication(sys . argv)window = focused emo()window . show()sys . exit(app . exec())运行结果如下图所示:

当按下并释放键盘键时,将调用以下方法:

keyPressEvent(self,event): 按下某一键时,该方法被调用直到键被释放为止;keyReleaseEvent(self,event) - 释放之前按下的键时被调用。

上述方法中的事件参数是一个QKeyEvent对象,其常用方法有:

key(): 返回按下键的值;text(): 返回按下键的Unicode字符编码信息,当按键为Shift, Control, Alt等时,则该函数返回的字符为空值。modifiers(): 判断按下了哪些修饰键(Shift,Ctrl,Alt,等等)。返回值为Qt. KeyboardModifier 中下列枚举变量的组合:NoModifier - 没有修饰键;ShiftModifier - Shift修饰键;ControlModifier - Ctrl修饰键;AltModifier - Alt修饰键;MetaModifier - 组合修饰键;KeypadModifier - 附加键盘上的任何按键;GroupSwitchModifier - 按下键(仅限X11系统)。isAutoRepeat(): 如果一直按着某键,返回True;否则,返回False;match(QKeySequence.StandardKey key): 如果当前的键组合与key相同,返回True;否则,返回False。

比如你有没有按下复制快捷键的代码:

如果e .匹配(QKeySequence。副本):打印(& # 34;组合键是& # 34;,QKeySequence。Copy)在处理键盘按键时,需要注意以下几点:

控件必须可以设置为输入焦点。有些控件,如QLabel是不能接受输入焦点的;捕获键盘事件要使用grabKeyboard( )方法,释放时,调用rekeaseKeyboard();可能拦截除Tab键和Shift+Tab键以外的任何键。因为默认Tab /Shift+Tab事件(切换焦点)被先捕获了, 要拦截这两个键,只能在event(self,event)中完成;如果要让父控件继续收到键盘事件,要调用事件的ignore()方法;否则,调用accept()。测试按键事件

KeyPressEvent和Event用于捕获测试代码演示中的键盘按压事件,paintEvent用于在窗口中央显示该事件。完整的代码如下:

importsysfromPyQt5importQtCore,QtGui,QtWidgetsfromPyQt5。QtCoreimportQt,QEventfromPyQt5。QtGuiimportQPainter,QPen,qfontfrompyqt 5 . qtwidgetsimportqapplication,qwidgetClassDemokeyboardEvent(q widget):def _ _ init _(self,parent = none):super(demokeyboardEvent,self)。_ _ init _ _ (parent) #设置窗口标题self.setwindowtitle (&# 33)实际PyQt5:键盘按键事件演示& # 39;)#设置窗口大小self.resize (400,320)self . key = & # 39;'# redraw窗口事件defraintevent (self,event):painter = qpainer(self)painter . set font(q font(self . font()。家(),36))画家。setpen (qpen (qt.blue))油漆工。setrenderhint(qpainer . text anti gallizing)#居中绘制文本信息painter。drawtext (self.rect(),qt.align center,self.key) #键盘按键事件defkeypressevent (self,event): self。'ifevent.key()==Qt。key _ Home:self . key = & # 39;首页& # 39;elifevent.key()==Qt。key _ End:self . key = & # 39;End & # 39elifevent.key()==Qt。key _ page up:if event . modifiers()& Qt。control modifier:self . key = & # 34;ctrl+page up & # 34;else:self . key = & # 34;PageUp & # 34elifevent.key()==Qt。key _ page down:if event . modifiers()& Qt。control modifier:self . key = & # 34;ctrl+page down & # 34;else:self . key = & # 34;PageDown & # 34elifQt。Key _ 0 & lt= event . key()& lt;=Qt。key _ 9:self . key = event . text()elif Qt。Key _ A & lt= event . key()& lt;=Qt。Key_Z:ifevent.modifiers()&Qt。shift modifier:self . key = & # 34;shift+& # 34;Self.key+=event.text()#如果key有空以外的字符,则画字符ifself.key:self.update()#否则继续监听此事件else: qwidget。keyPressEvent (self,Event) # tab键不会传递给keyPressEvent,因为涉及到焦点切换,所以需要Defevent(self,event):#如果一个键被按下,并且该键是tab键,如果event。type () = = qevent。按键事件。key()= = Qt . key _ tab:self . key = & # 34;Tab & # 34self . update()returntrue returnqwidget . event(self,event)if _ _ name _ _ = = & # 39;_ _ main _ _ & # 39:app = QA application(sys . argv)window = demokeyboardevent()window . show()sys . exit(app . exec())测试结果如下:

本文重点介绍知识点和事件;快捷键设置;键盘按下和释放事件;使用QPainter以指定的样式绘制文本信息。关注,收藏,喜欢,评论,转发如果你喜欢这篇文章的内容。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/409837.html

发表回复

登录后才能评论