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

文章目录

    • 1.概述
    • 2.焦点
    • 3.强制获取键盘消息
    • 4.键盘常用组合方法
    • 5.总结

1.概述

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

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

widget下常用两个虚函数:

	virtual void keyPressEvent(QKeyEvent* e);   //键盘按下事件
	virtual void keyReleaseEvent(QKeyEvent* e); //键盘松开事件

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

2.焦点

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

	void focusInEvent(QFocusEvent* event); //焦点进入事件
	void focusOutEvent(QFocusEvent* event); //失去焦点事件

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

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设置的键盘快捷键不受影响。

    void grabKeyboard();
    void releaseKeyboard();

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

4.键盘常用组合方法

// 键盘按下事件
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.总结

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

你可能感兴趣的:(C++,Windows,Qt,Qt-键盘消息的传递,键盘消息的获取,C++)