我们需要 快捷键 来使 触发 功能,这时候 我们需要 QT的组合键来完成
#include <QKeyEvent>
key() 是 键盘按下的单键 基本包括了整个键盘的键
modifiers() 是 组合热键 使用 包括 ctrl ,shift ,alt等
protected:
virtual void keyPressEvent(QKeyEvent * event)Q_DECL_OVERRIDE;
void CompositekeyShortcuts::keyPressEvent(QKeyEvent* event)
{
//组合键 响应
if (event->key() == Qt::Key_B && event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier))
{
QMessageBox::information(nullptr, QStringLiteral("信息"), QStringLiteral("Ctrl + shift + B"));
}
else if (event->modifiers() == (Qt::AltModifier | Qt::ControlModifier))
{
QMessageBox::information(nullptr, QStringLiteral("信息"), QStringLiteral("Ctrl + Alt"));
}
else if (event->key() == Qt::Key_A && event->modifiers() == (Qt::AltModifier | Qt::ControlModifier))
{
QMessageBox::information(nullptr, QStringLiteral("信息"), QStringLiteral("Ctrl + Alt + A"));
}
//单个键盘 按下发生
//if (event->key() == Qt::Key_B)
//{
// QMessageBox::information(nullptr, QStringLiteral("信息"), QStringLiteral("%1").arg(event->text()));
//}
//else if (event->key() == Qt::Key_Shift)
//{
// // event->text() 不能打印出来 shift 为空白
// QMessageBox::information(nullptr, QStringLiteral("信息"), QStringLiteral("%1").arg(event->text()));
//}
event->text() 可以区分 大小写的 字母 如下
event->text() 不能区分 shift 单键 打印的为空
组合 键 ctrl + shift + B
组合 键 ctrl +Alt
组合 键 ctrl +Alt + A 不能打印出任何东西 ,它被QQ的全局热键所占用;当我们退出QQ时 有效; 但是 我们还需要注释掉 组合键 ctrl + ALt 否则 会显示他们两的热键,而不会选择 ctrl + alt +A
正常显示如下如:
我们发现有一个 问题 ,就是我们长按一个 按钮的时候 会一直 打印一个信息
我们怎么解决呢?
event->isAutoRepeat() 这个函数 判断的是 是否自动触发 如果是
keyPressEvent 事件 那么按下就是 我们按下的 松开 是自动触发的(相当于,我们长按一个键,系统又帮我们自动触发松开事件)
在没松开键的时候只有第一下 是为false :后面都是自动触发 isAutoRepeat 就为true
//单个键盘 按下发生
if (event->key() == Qt::Key_B)
{
if (event->isAutoRepeat())
{
QMessageBox::information(nullptr, QStringLiteral("信息"), QStringLiteral("%1").arg(QStringLiteral("自动触发")));
}
else
{
QMessageBox::information(nullptr, QStringLiteral("信息"), QStringLiteral("%1").arg(event->text()));
}
}
参考博客:
键盘按下事件 组合键
长按一个键 不松 会一直打印