QT 如何给程序添加快捷键事件

众所周知,如果软件有快捷键,将大大提升我们的生产效率。本文此次介绍给程序设置快捷键的四种方法。

<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>利用键盘钩子实现快捷键

上述的几种方式,都要求程序或者控件获得焦点,才会响应快捷键。
使用键盘钩子的方式,可以在程序没有焦点时,也可以响应快捷键(一般游戏外挂都是这种方式实现的,不然自己的程序获得焦点时,游戏窗口也将失去焦点,导致游戏无法正常操作了),本文暂不对该实现方式展开赘述,后期将整理出一篇此类文章。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hellokandy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值