众所周知,如果软件有快捷键,将大大提升我们的生产效率。本文此次介绍给程序设置快捷键的四种方法。
<1>利用QAction,给QAction对象设置快捷键
//定义QAction的对象
QAction* action = new QAction(this);
//设置触发QAction对象的快捷操作
action->setShortcut(QKeySequence("Ctrl+W"));
//把QAction的对象加入到当前窗口中去
this->addAction(action);
//连接信号与槽
connect(action, &QAction::triggered, this, &QtShortcutDemo::slotDoAction);
<2>利用QShortcut实现快捷键
QShortcut* shortcut = new QShortcut(check01);
//设置键值,也就是设置快捷键.
shortcut->setKey(QKeySequence("Ctrl+1"));
//设置是否会自动反复按键,也就是说:当你一直按住键盘Ctrl+1时,会一直不停的调用对应的槽函数.
shortcut->setAutoRepeat(false);
//连接信号与槽
connect(shortcut, &QShortcut::activated, this, [=]() {
QCheckBox* ckb = static_cast<QCheckBox*>(shortcut->parentWidget());
if (ckb) {
ckb->setChecked(!ckb->isChecked());
}
//QMessageBox::information(this, ("Shortcut"), "ctrl + 1", QMessageBox::StandardButton::Ok);
});
<3>利用重写键盘或者鼠标事件
连接键盘按下的信号和槽
connect(this, &QtShortcutDemo::sigKeyEvent, &QtShortcutDemo::slotKeyEvent);
重写键盘和鼠标事件
void QtShortcutDemo::keyPressEvent(QKeyEvent* event)
{
//单键触发
if (event->key() == Qt::Key_F1)
emit sigKeyEvent("Qt::Key_F1");
//组合键触发
if ((event->modifiers() == Qt::CTRL) && (event->key() == Qt::Key_Q))
emit sigKeyEvent("Qt::CTRL + Qt::Key_Q");
QDialog::keyPressEvent(event);
}
void QtShortcutDemo::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::MiddleButton) {
//鼠标中键触发
emit sigKeyEvent("Qt::MiddleButton");
}
else if ((QApplication::keyboardModifiers() == Qt::CTRL) && (event->button() == Qt::LeftButton)) {
//Ctrl+鼠标左键组合
emit sigKeyEvent("Qt::CTRL + Qt::LeftButton");
}
QDialog::mousePressEvent(event);
}
<4>重写eventFilter函数
注意在构造函数中安装事件过滤器:QApplication::instance()->installEventFilter(this);
bool QtShortcutDemo::eventFilter(QObject* watched, QEvent* event)
{
if (watched && event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* me = static_cast<QMouseEvent*>(event);
if (me->button() == Qt::LeftButton)
{
qDebug() << "eventFilter,Qt::LeftButton";
}
}
if (watched && event->type() == QEvent::KeyPress)
{
QKeyEvent* evt = static_cast<QKeyEvent*>(event);
if (evt->key() == Qt::Key_Return || evt->key() == Qt::Key_Enter)
{
return true;
}
if ((evt->modifiers() == Qt::CTRL))
{
if (evt->key() == Qt::Key_2) {
check02->setChecked(!check02->isChecked());
}
}
}
return QDialog::eventFilter(watched, event);
}
<5>利用键盘钩子实现快捷键
上述的几种方式,都要求程序或者控件获得焦点,才会响应快捷键。
使用键盘钩子的方式,可以在程序没有焦点时,也可以响应快捷键(一般游戏外挂都是这种方式实现的,不然自己的程序获得焦点时,游戏窗口也将失去焦点,导致游戏无法正常操作了),本文暂不对该实现方式展开赘述,后期将整理出一篇此类文章。