头文件中添加:
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);
}