QT开发之自绘控件中获取单个键盘按键和组合键

本文详细介绍了在Qt中如何通过自定义控件捕获全局键盘事件,包括处理方向键、组合键等,并提供了实现代码示例。特别强调了使用grabKeyboard()方法的注意事项及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件中添加:

void keyPressEvent(QKeyEvent *event);

cpp

void 自绘控件::keyPressEvent(QKeyEvent *event)
{

    if(event->key() == Qt::Key_Up)//上
    {
      qDebug() << "press key up";
        return;
    }
    else if(event->key() == Qt::Key_Down)//下
    {
      qDebug() << "press key down";
      return;
    }
    else if (event->key() == Qt::Key_Left)//左右
    {
      qDebug() << "press key left";
      return;
    }
    else if (event->key() == Qt::Key_Right)//右
    {
      qDebug() << "press key right";
      return;
    }

    if ((event->modifiers() == Qt::ControlModifier) and (event->key() == Qt::Key_A) )//CTRL+A
    {
        qDebug()<<"ctrl-a";
    }
}

上面这样是无法获取组合键响应的,需要在构造函数中添加:this->grabKeyboard();//捕获键盘消息

注意:

帮组文档:

Grabs the keyboard input.

This widget receives all keyboard events until releaseKeyboard() is called; other widgets get no keyboard events at all. Mouse events are not affected. Use grabMouse() if you want to grab that.

The focus widget is not affected, except that it doesn't receive any keyboard events. setFocus() moves the focus as usual, but the new focus widget receives keyboard events only after releaseKeyboard() is called.

If a different widget is currently grabbing keyboard input, that widget's grab is released first.

See also releaseKeyboard(), grabMouse(), releaseMouse(), and focusWidget().

网上查询:

在多个窗口一起存在时,其中一个窗口需要一直获取键盘事件:可以在这个窗口中捕获键盘事件,即grabKeyboard(); 这样这个窗口可以一直获取键盘事件。即使这个窗口不在激活状态下依然可以获取键盘事件。同时激活状态的窗口是获取不到任何键盘事件的,直到捕获了键盘事件的窗口释放键盘事件releaseKeyboard(),才能获取键盘事件。

如果不释放,在软件的其它位置按下ctrl+a添加了捕获键盘消息的控件还是会捕获这个组合键

 

 

上面的方法如果是创建了多个相同控件后就不好使了,因为this->grabKeyboard();是全局的只能有一个能设置为键盘输入,所以需要在自绘控件中弄一个信号来判断是那个控件是当前或者控件

比如ListWidget控件中,我使用点击列的信号来设置就可以了,

connect(this,&MyListWidget::currentRowChanged,[=](int a)
    {
        this->grabKeyboard();
    });

或者在鼠标按下的函数中:

//鼠标点击
void MyListWidget::mousePressEvent(QMouseEvent *event)
{
    this->grabKeyboard();
    QListWidget::mousePressEvent(event);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值