Qt键盘事件

转载 2012年03月29日 16:00:00

注意:如果你需要的全局热键:请移步:Qt 全局热键 QxtGlobalShortcut 分析与使用举例

Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效。下面关注点在按键特有的部分:

focus

一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。

焦点移动的方式有以下几种:

  • 按下Tab或Shift+Tab
    • 注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等

    • Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。
  • 点击一个QWidget
    • 建议:只对接受文本输入的Widget启用该功能
  • 按下键盘的快捷键
    • QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持
  • 使用鼠标滚轮
  • 用户移动焦点
    • 程序将决定被设置focus的Widget的哪一个子Widget获得焦点

注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget

focusPolicy

一个QWidget获得焦点的方式受 focusPolicy 控制

Qt::TabFocus
通过Tab键获得焦点
Qt::ClickFocus
通过被单击获得焦点
Qt::StrongFocus
可通过上面两种方式获得焦点
Qt::NoFocus
不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点

keypress和keyrelease

首先,我们要是Widget获得焦点,一般设置focusPolicy。

然后要对按键进行响应,我们只需要直接重载:

  • keyPressEvent
  • keyReleaseEvent

注意:

  • 对我们不处理的事件,要调用父类的相应事件处理函数。
  • 如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。
  • 有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。

QKeyEvent

在windows下,与键盘事件有关的有8个消息:

  • 对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息
  • 有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。

这些消息在Qt中只体现在QKeyEvent中。

  • 对字符,可通过 QKeyEvent::text() 获得
  • 其他键,QKeyEvent::key() 获得一个键值

event函数

由于 Tab 键被用来切换焦点,这使得它与众不同。

这是qwidget.cpp的event函数中的代码片段:

case QEvent::KeyPress:
{   
    QKeyEvent *k = (QKeyEvent *)event;   
    bool res = false;
    if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier)))
   {  //### Add MetaModifier? 
       if (k->key() == Qt::Key_Backtab || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier)))
           res = focusNextPrevChild(false);
       else if (k->key() == Qt::Key_Tab)
           res = focusNextPrevChild(true);
      if (res)
          break;
   }
   keyPressEvent(k); 
}

如果我们需要处理Tab键,需要重载 event 函数。

Qt按键键值 与 相关字符串 的映射表

Qt快捷键 映射 "Esc",/*Qt::Key_Escape 0x01000000 */ "Tab",/*Qt::Key_Tab 0x01000001 */ "Shift+Tab"...
  • foreverhuylee
  • foreverhuylee
  • 2015年07月04日 17:02
  • 2286

window下完整安装QT

1.先下载
  • u014304293
  • u014304293
  • 2014年09月19日 08:53
  • 2520

Qt多线程基础(一)线程同步之互斥锁同步

一、直接使用QMutex进行同步 创建线程方法:继承自QThread,重写void run()函数,调用成员start()启动线程,start()中可加入优先级参数。 互斥锁同步方法:void run...
  • hechao3225
  • hechao3225
  • 2016年11月04日 13:45
  • 6425

一个半路出家的10年程序员:谈工作、学习与Qt

 2014-12-16 03:25 ⁄ 工业·编程 ⁄ 共 9620字 ⁄ 字号 小 中 大 ⁄ 评论 8 条     安晓辉,2014年CSDN博文大赛编...
  • sanmaoljh
  • sanmaoljh
  • 2015年11月04日 17:52
  • 3328

Qt 程序打包发布总结

1.  概述  当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行。编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安...
  • liuyez123
  • liuyez123
  • 2016年01月05日 14:59
  • 36985

Qt多线程的正确用法

QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用。QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事...
  • caoshangpa
  • caoshangpa
  • 2016年10月11日 09:04
  • 6646

Qt数据库:(三)利用QSqlQuery类执行SQL语句(一)

SQL即结构化查询语言,是关系数据库的标准语言。前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句。需要说明,我们这里只是Qt教程,而非专业的数据库教程,所以我们不会对数据库中的一些知...
  • liuligui5200
  • liuligui5200
  • 2015年07月20日 11:40
  • 9289

Qt---自带的数据库QSQLITE

database.h#ifndef DATABASE_H #define DATABASE_H#include #include #include #include #include #in...
  • u012319493
  • u012319493
  • 2016年07月23日 22:36
  • 14037

Qt图形用户界面编程技术入门

本文向读者介绍利用Qt开发图形用户界面的应用程序的入门知识。这里,我们首先介绍了如何搭建Qt的开发环境,之后通过一些简单的示例程序来循序渐进地介绍Qt的“信号和槽”以及布局等基本概念。我们希望以此来帮...
  • u014070670
  • u014070670
  • 2014年12月29日 09:30
  • 7962

Qt学习很好的总结

widget,MainWindow和Dialog的选择使用 2012-11-06 10:39:30 分类: LINUX Qt中的每个类,都有一个对应的同名头文件,其中包...
  • foreverhuylee
  • foreverhuylee
  • 2015年04月19日 21:02
  • 3058
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt键盘事件
举报原因:
原因补充:

(最多只允许输入30个字)