键盘事件

1、Qt使用QKeyEvent类来描述与键盘有关的信息,比如按下或释放键的代码,使用枚举类型QEvent::Type描述与键盘有关的事件,比如QEvent::KeyPress表示键盘按下事件,QEvent::KeyRelease表示键盘释放事件等。

2、是否接收键盘事件,最好明确的调用QEvent::ignore()和QEvent::accept()函数。

3、按键与字符:对于键盘,通常按下一个键会产生一个字符,比如按下A键,会产生字符"a",但有些键不会产生字符,比如delete、insert等键,而且按下A键不一定必须产生字符"a"(比如在中文、德文等其他非英文国家键盘布局的情形下,按键A不一定会产生字符"a")。

4、捕获键盘输入的原理与捕获鼠标输入是相同的,详见鼠标事件。

5、按键与自动重复:自动重复是指按下键盘上的键(修饰键除外)不放时,会不断重复的发送键按下事件,Qt默认是启用自动重复的,若要实现类似按键A+D之类的快捷键,就需要关闭自动重复。可使用如下方法来关闭自动重复

if( QKeyEvent::isAutoRepeat() ) return; // 若自动重复则什么也不做。

6、压缩按键事件(默认为关闭):

①、按下一个键不放时,会不断的发送键按下事件,若程序的处理跟不上键的输入,则Qt可能会尝试压缩该事件,以便在每个事件中处理多个字符。

②、Qt只对可打印字符启用键事件压缩,对于像Enter、Backspace等键不会启用键事件压缩。

③、Mac和X11以外的平台不支持此功能。

④、可使用以下函数来设置键压缩属性

void QWidget::setAttribute ( Qt::WidgetAttribute attribute, bool on=true);

 若on为true,则设置部件的属性attribute,若为false,则清除该属性。

示例:setAttribute ( Qt::WA_KeyCompression , rue) //启用键事件压缩。

 其中Qt::WidgetAttribute是一个枚举,该枚举定义了部件的一些常用属性,其中对键事件压缩的枚举值为Qt::WA_KeyCompression

bool QWidget::testAttribute(Qt::WidgetAttribute attribute) const

 若设置了属性attribute则返回true,否则返回false。

7、Qt使用枚举类型Qt::Key来描述键盘的键代码,下表为该枚举定义的部分成员(详见帮助文档)


8、下面为QKeyEvent类中的成员函数

①、QKeyEvent ( Type type, int key, Qt::KeyboardModifiers modifiers,

const QString &text = QString(), bool autorep = false, ushort count = 1)

 type:表示键盘事件的类型,必须是QEvent::KeyPress、QEvent::KeyRelease、QEvent::ShortcutOverride之一

 key:用于描述键代码的Qt::Key枚举值。

 modifiers:表示键盘的修饰键。

 text:表示由按键生成的Unicode字符。

 autorep:是否启用自动重复

count:产生该事件时的按键数量。

 说明:这是QKeyEvent类的构造函数之一(共有2个),本文仅列举这一个,构造函数可以用于创建QKeyEvent类型的自定义事件,构造函数的参数虽然较多,但是,这些参数只是为创建的事件提供了一些必要的信息而已。

示例:

QKeyEvent e(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier ,

"b", false, 1 );

表示创建一个类型为QEvetn::KeyPress的键盘按下事件,该事件由按键A产生,没有键盘修饰键被按下,但是产生的字符是"b"而不是"a",该事件的重复计数被关闭,且按键数只有1个。创建该自定义事件后,可以使用sendEvent进行发送,并使用部件类的event()函数接收并处理该事件

②、bool isAutoRepeat() const

若事件来自自动重复键,则返回true,否则表示来自初始键按下,返回false,注意,若事件是一个多键压缩事件,则此函数可能会不确定地返回true或false。

③、int key() const

返回按下或释放时来自Qt::Key中定义的键代码(不区分大小写)

④、QString text() const

返回按键所对应的Unicode字符。注:按下Shift,Control,Alt和Meta等修饰键时,返回值在不同平台间有所不同,并可能返回空字符串。

⑤、Qt :: KeyboardModifiers modifiers() const /

返回按下的修饰键,注意:此函数并不总是可靠。

⑥、bool matches (QKeySequence::StandardKey key ) const

若按键与在枚举中QKeySequence::StandardKey定义的标准的key匹配,则返回true,否则返回false。

 枚举QKeySequence::StandardKey定义了一些常用的快捷键,比如StandardKey::Copy表示的“复制”的标准快捷键为Ctrl+C,若按下Ctrl+C则这时与StandardKey::Copy是匹配的,返回true。其他的还有“剪功”的快捷键为Ctrl+X,其枚举值为StandardKey::Cut等。

9、QWidget类中与键盘事件有关的函数

①、void grabKeyboard() //捕获键盘输入。

②、void releaseKeyboard() //释放捕获的键盘输入。

③、static QWidget* keyboardGrabber();返回正在捕获键盘输入的部件,若没有则返回0。

本小节学习了以下类及其成员函数

1、QEvent类

①、QEvent(Type type) //构造函数,用于创建自定义事件

②、virtual ~QEvent() //析构函数

③、void accept() //接受事件

④、void ignore() //忽略事件

⑤、void setAccepted(bool a) //设置是否接受事件

⑥、Type type() const //返回事件的类型

⑦、static int registerEventType(int hint=-1):

注册并返回自定义事件类型,使用该函数的返回值可保证自定义的事件不会有重复的Type枚举值。

⑧、enum Type{None, ActionAdded, … Keypress,…} //定义事件的类型,详见帮助文档

2、QObject类

①、virtual bool event() //接收并处理事件,先于默认的事件处理函数

②、void installEventFilter(QObject *finterObj); //安装(或注册)事件过滤器

③、vitrual bool eventFilter(QObject* w , QEvent *e ) //用于接收并处理事件过滤器对象接收的事件。

④、void removeEventFilter(QObject* obj); //移除事件过滤器。

3、QCoreApplication类

①、virtual bool notify(QObject* r, QEvent* e) //该函数用于分发事件

②、int exec(); //使用该函数进入事件主循环。

③、void postEvent(QObject* r, QEvent* e, int priority=Qt::NormalEventPriority); //用于发布自定义事件

④、bool sendEvent(QObject* r, QEvent *e); //用于发送自定义事件

4、QWidget类

①、void grabKeyboard() //捕获键盘输入

②、void grabMouse() //捕获鼠标输入

③、void grabMouse(const QCursor& c); //捕获鼠标输入

④、QWidget* keyboardGrabber(); //返回捕获键盘输入的部件

⑤、QWidget* mouseGrabber(); //返回捕获鼠标输入的部件

⑥、void releaseMouse() //释放捕获的鼠标输入

⑦、void releaseKeyboard() //释放捕获的键盘输入。

⑧、bool hasMouseTracking() const; //是否启用鼠标跟踪

⑨、void setMouseTracking(bool enable) //设置鼠标跟踪状态

⑩、bool underMouse() const; //部件是否位于鼠标光标之下

11、void setAttribute ( Qt::WidgetAttribute attribute, bool on=true); //设置是否启用键压缩。

12、bool testAttribute(Qt::WidgetAttribute attribute) const //返回是否启用了键压缩。

5、本小节学习到的枚举类型

①、Qt::WidgetAttribute枚举的枚举值WA_KeyCompression(键压缩)

②、Qt::KeyboardModifier //描述键盘修饰键(即Alt、Ctrl、Shift等键)

③、Qt::MouseButton //描述鼠标信息(比如按下的是鼠标左键、右键或中键等)

④、Qt::MouseEventSource //描述鼠标事件的来源(比如鼠标事件来源于真正的鼠标还是由触摸屏仿真的)

⑤、Qt::Key //描述键盘的键代码。

6、以及QMouseEvent和QKeyEvent类中

QtWidgets模块继承关系图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容