Qt-键盘消息的传递-键盘消息的获取-C++

文章目录

1.概述

QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件。

QKeyEvent 的 key() 函数可以获取具体的按键,对于 Qt 中给定的所有按键,可以在帮助中查看 Qt: :Key 关键字。需要特别说明的是,回车键在这里是 Qt::Key_Return;键盘上的一些修饰键,比如 Ctrl 和 Shift 等, 这里需要使用 QKeyEvent 的 modifiers() 函数来获取,可以在帮助中使用 Qt:: KeyboardModifier 关键字来査看所有的修饰键。

widget下常用两个虚函数:

cpp 复制代码
	virtual void keyPressEvent(QKeyEvent* e);   //键盘按下事件
	virtual void keyReleaseEvent(QKeyEvent* e); //键盘松开事件

重载这两个虚函数就能响应键盘消息。

2.焦点

输入的按键字符一定会有响应对象,控制响应对象的就是对象的焦点属性,简单来说,拥有焦点的对象接受键盘消息,Qt Widget中与焦点有关的两个事件如下所示:

cpp 复制代码
	void focusInEvent(QFocusEvent* event); //焦点进入事件
	void focusOutEvent(QFocusEvent* event); //失去焦点事件

与焦点控制有关的两个函数:

cpp 复制代码
void setFocusPolicy(Qt::FocusPolicy policy);//获取焦点政策
void setFocus(Qt::FocusReason reason); //当前控件拥有焦点
inline void setFocus() { setFocus(Qt::OtherFocusReason); }

获得焦点的办法:

FocusPolicy::ClickFocus 表示鼠标点击小部件时会获得焦点
FocusPolicy::TabFocus 表示可通过Tab键切换可获得焦点
FocusPolicy::WheelFocus 表示可通过鼠标滚轮切换获得焦点
FocusPolicy::StrongFocus 表示可通过鼠标滚轮点击切换获得焦点
FocusPolicy::NoFocus 不可获得焦点(默认设置)

3.强制获取键盘消息

这个小组件接收所有的键盘事件,直到调用releaseKeyboard();其他小组件完全没有得到键盘事件。Qt设置的键盘快捷键不受影响。

cpp 复制代码
    void grabKeyboard();
    void releaseKeyboard();

有时候,widget获取不了键盘事件,可以采用这两个函数加强,放在在聚焦函数中获取,失去焦点时释放。

4.键盘常用组合方法

cpp 复制代码
// 键盘按下事件
void Widget::keyPressEvent(QKeyEvent * event)
{
    // 普通键
    switch (event->key())
    {
        // ESC键
        case Qt::Key_Escape:
            qDebug() <<"ESC";
        break;
        // 回车键
        case Qt::Key_Return:
            qDebug() <<"Enter";
        break;
        // F1键
        case Qt::Key_F1:
            qDebug() <<"F1";
        break;
    }

    // 两键组合
    if(event->modifiers() == Qt::ControlModifier) { // 如果按下了CTRL键
        if(event->key() == Qt::Key_M){
           qDebug()<<"CTRL + M";
        }
    }

    if(event->modifiers() == Qt::AltModifier) { // 如果按下了ALT键
       if(event->key() == Qt::Key_M)
           qDebug()<<"ALT + M";
    }

    if(event->modifiers() == Qt::ShiftModifier){ // 如果按下了Shift键
           if(event->key() == Qt::Key_M)
               qDebug()<<"Shift + M";
    }

    // 三键组合Shift + Ctrl + A的实现
    if (event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && event->key() == Qt::Key_A) {
        qDebug() << "CTRL + Shift + A";
    }
}

// 键盘释放事件
void Widget::keyReleaseEvent(QKeyEvent *event)
{
    // 方向UP键
    if(event->key() == Qt::Key_Up)
    {
        qDebug() << "release: "<< "up";
    }
}

5.总结

键盘的输入,是系统信息输入关键,还有其它要点,项目涉及时再总结更新。

相关推荐
m0_748233643 分钟前
jank实现C++无缝互操作的技术探索
开发语言·c++
沢田纲吉4 分钟前
《LLVM IR 学习手记(七):逻辑运算与位运算的实现与解析》
前端·c++·编译器
BAGAE5 分钟前
HTTPS 加密原理介绍
java·c++·websocket·http·均值算法·启发式算法·最小二乘法
半桔29 分钟前
【IO多路转接】IO 多路复用之 select:从接口解析到服务器实战
linux·服务器·c++·github·php
无聊的小坏坏30 分钟前
从零开始:C++ 线程池 TCP 服务器实战(续篇)
服务器·c++·tcp/ip
ALex_zry31 分钟前
C++中使用gRPC over Unix Domain Sockets的高性能进程间通信技术解析
开发语言·c++·unix
Q741_14731 分钟前
C++ 分治 快速排序优化 三指针快排 力扣 面试题 17.14. 最小K个数 题解 每日一题
c++·算法·leetcode·快排·topk问题
小年糕是糕手32 分钟前
【C语言】函数栈帧的创建和销毁
java·c语言·开发语言·数据结构·c++·链表
努力努力再努力wz1 小时前
【Linux进阶系列】:信号(下)
java·linux·运维·服务器·开发语言·数据结构·c++
zzzsde1 小时前
【C++】stack和queue:使用&&OJ题&&模拟实现
开发语言·c++