QT 键盘监听

前言:

转载请附上连接,本帖原创请勿照抄。

  QT检测按键需要了解的地方有两块地方:1、键盘值;2、键盘事件、组合键、组合键响应方法

  Demo演示:接下来会将详细步骤。

一、键盘值

    先了解各个键位的值,然后再写代码。参考自:https://blog.csdn.net/weixin_42692504/article/details/95116279

二、如何捕获键盘按下、弹起、组合键、大小写事件、组合键响应方法

  1.键盘按下、弹起事件

    mainwindow.h

//引入头
#include <QKeyEvent>

//重写
/*
    * keyPressEvent 按钮按下事件
    * keyReleaseEvent 按钮弹起事件
    * *k * event 的意思是大家后面的变量可以自由发挥
*/
void keyPressEvent( QKeyEvent *k );

void keyReleaseEvent( QKeyEvent * event);

    mainwindow.cpp

#include <QMessageBox>

//加入utf-8防止汉字乱码
#pragma execution_character_set("utf-8")

//构造函数初始化部分加入
this->grabKeyboard();

//键盘按下事件
void MainWindow::keyPressEvent( QKeyEvent *k )
{
    QString QKeyMenu="";
    const char *keyA="a";

    if(k->key() == Qt::Key_A)
    {
        QKeyMenu=k->key();
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
    else if(k->key() == Qt::Key_B)
    {
        QKeyMenu=k->key();
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
    else if(k->key() == Qt::Key_C)
    {
        QKeyMenu=k->key();
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
}

//键盘弹起事件
void MainWindow::keyReleaseEvent( QKeyEvent * event)
{
    QString QKeyMenu="";
    const char *keyA="a";
    if (event->key() == Qt::Key_CapsLock)
    {
        QKeyMenu="CapsLock键弹起";
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }

    //保持编辑器在光标最后一行
    QTextCursor cursor=ui->textEdit->textCursor();
    cursor.movePosition(QTextCursor::End);
    ui->textEdit->setTextCursor(cursor);
}

  2.组合键、大小写事件

  看下面代码有处问题需要注意,在JPG演示的时候单独按下CapsLock键“按下”没有响应,弹起出发了事件。这是因为单独的按键监听需要放在组合键之前,组合键会触发按钮单独响应。

  大小写问题,界面一开始处于汉语输入法一般情况先按Shift键切换英文然后再按CapsLock键切换大写,可以建立全局变量根据CapsLock按下次数来判断是否大小写。

    else if(k->key() == Qt::Key_Control)            //ctrl键
    {
        QKeyMenu="ctrl键按下";
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
    else if(k->key() == Qt::Key_Alt)                //左侧alt键
    {
        QKeyMenu="左侧alt键按下";
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
    else if(k->key() == Qt::Key_AltGr)              //右侧alt键
    {
        QKeyMenu="右侧alt键按下";
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
    //检测Ctri+CapsLock组合键 和 CapsLock大小写键
    if ((k->modifiers() == Qt::ControlModifier) && (k->key() == Qt::Key_CapsLock))
    {
        QKeyMenu="组合键ctrl+CapsLock";
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
    else if (k->key() == Qt::Key_CapsLock)          //CapsLock 大小写
    {
        QKeyMenu="0";
        QKeyMenu+=k->nativeModifiers() & Qt::Key_CapsLock;
        ui->textEdit->insertPlainText(QKeyMenu +='\n');
    }
    //保持编辑器在光标最后一行
    QTextCursor cursor=ui->textEdit->textCursor();
    cursor.movePosition(QTextCursor::End);
    ui->textEdit->setTextCursor(cursor);

   3.组合按键响应方法

//按键+鼠标组合,例如ctrl+左击(先ctrl后左击触发,先左击后ctrl不可触发):
if ((QApplication::keyboardModifiers() == Qt::ControlModifier) && (event->button() == Qt::LeftButton))
{
    QMessageBox::aboutQt(NULL, "aboutQt");
}

//按键+鼠标组合方法2,例如A+左击(先A后左击,先左击后A均可触发):
if ((event->key() == Qt::Key_A) && (QApplication::mouseButtons() == Qt::LeftButton))
{
    QMessageBox::aboutQt(NULL, "aboutQt");
}

//按键+按键组合,例如ctrl+字母(先ctrl后A触发,先A后ctrl不可触发):
if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_A))
{
    QMessageBox::aboutQt(NULL, "aboutQt");
}

三、其它文章

 这么多记不住怎么办,赶紧点收藏呀~,页面右下角五角星收藏。

下载链接:https://download.csdn.net/download/qq_37529913/13008300

 传送门:https://blog.csdn.net/qq_37529913/article/details/106765916

    全面的QT 样式表:https://blog.csdn.net/qq_37529913/article/details/108735409

   

 

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt中可以通过重写QWidget或QMainWindow的keyPressEvent()函数来监听键盘事件。当用户在窗口中按下键盘上的任意键时,该函数将被调用。我们可以通过判断event->key()的键值来区分不同的按键,并根据需要进行相应的操作。 以下是一个简单的例子,演示如何在一个继承自QMainWindow的类中监听键盘事件: ```cpp class MyMainWindow : public QMainWindow { public: MyMainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 设置窗口的焦点策略,使其能够接收键盘事件 setFocusPolicy(Qt::StrongFocus); } protected: void keyPressEvent(QKeyEvent *event) override { // 判断按下的键值 switch (event->key()) { case Qt::Key_Escape: qDebug() << "Esc key pressed"; break; case Qt::Key_Enter: qDebug() << "Enter key pressed"; break; // 其他按键的处理 default: QMainWindow::keyPressEvent(event); break; } } }; ``` 在这个例子中,我们继承了QMainWindow类,并重写了其keyPressEvent()函数。在函数内部,我们使用switch语句来判断按下的键值。当按下Esc时,输出"Esc key pressed";当按下Enter时,输出"Enter key pressed"。其他按键的处理可以根据需求进行扩展。 需要注意的是,如果我们希望窗口能够接收键盘事件,我们需要在构造函数或初始化函数中设置窗口的焦点策略,例如通过setFocusPolicy(Qt::StrongFocus)来设置。这样,窗口将成为焦点项,并能够接收键盘事件。 以上就是使用Qt在后台监听键盘事件的方法,希望对你有所帮助。 ### 回答2: 在Qt中,我们可以通过继承QObject类并重新实现其eventFilter方法来实现对键盘事件的后台监听。具体步骤如下: 1. 创建一个新的类,继承自QObject类。 ```c++ class KeyEventListener : public QObject { Q_OBJECT public: explicit KeyEventListener(QObject *parent = nullptr) : QObject(parent) { } protected: bool eventFilter(QObject *obj, QEvent *event) override { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); qDebug() << "Key Pressed: " << keyEvent->key(); // 在这里可以处理键盘事件,例如发送信号给其他对象进行相应操作 // 或者在此处进行特定的按键快捷操作 } // 始终返回false,以便将事件传递给被监听的对象 return false; } }; ``` 2. 在需要监听键盘事件的对象中,安装该事件过滤器。 ```c++ // 在需要监听键盘事件的地方,例如MainWindow的构造函数中 KeyEventListener *keyListener = new KeyEventListener(this); qApp->installEventFilter(keyListener); ``` 现在,当用户在应用程序中按下键盘时,键盘事件将被传递给keyListener对象的eventFilter方法进行处理。你可以根据自己的需要在eventFilter方法中添加适当的处理逻辑。 需要注意的是,keyListener对象需要在需要监听键盘事件的对象的生命周期内保持有效,因此通常将其分配为成员变量或全局对象。 另外,如果你希望对特定的窗口部件进行键盘事件监听,也可以直接将keyListener对象传递给该部件的installEventFilter方法。 ### 回答3: 在Qt中,我们可以通过重写QWidget的keyPressEvent()函数来监听键盘事件。当用户在程序窗口中按下键盘时,该函数就会被调用。 首先,我们需要创建一个继承自QWidget的自定义窗口类。在这个类中,我们重写keyPressEvent()函数,并在其中实现我们需要的逻辑。 在keyPressEvent()函数中,我们可以获取到用户按下的键盘事件的信息,包括按下的按键代码、按键字符等。我们可以根据这些信息来执行相应的操作,例如移动窗口、改变窗口大小、响应特定按键等。 除了重写keyPressEvent()函数,我们还可以重写其他相关的函数,例如keyReleaseEvent()函数,用于监听键盘松开事件。通过这些函数,我们可以完全控制程序窗口对键盘事件的响应。 在程序中,我们需要创建一个该自定义窗口类的实例,并将其设置为程序的主窗口。这样,整个程序就可以在后台监听用户的键盘事件了。 需要注意的是,当我们使用后台监听键盘事件时,可能会影响系统的其他键盘输入。因此,我们需要谨慎使用,并确保对用户的输入做出合适的响应,以提供良好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双子座断点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值