0
点赞
收藏
分享

微信扫一扫

用OpenArk查看Windows 11电脑中全部快捷键并解决热键冲突问题

悲催博士僧 03-01 09:30 阅读 4

今天聊聊事件,实际上我们在前两篇文章中就已经接触到了事件,分别是定时器事件和绘画事件,今天我们再来看看其他的事件。

我们打开QT助手,在QWidget的界面中找到下图中的地方。

我们可以看到很多函数的结尾都是Event,那么这些就是事件函数了。

检测键盘输入

上篇文章的末尾提了一嘴这个,我们知道怎么检测键盘输入之后再结合之前文章介绍过的内容,那么就足够跟着我更之前的文章去写一些小游戏什么的了。

从函数名中我们也不难看出,我们需要用到的是下面这个。

凭借我高超的英语水平(四级差122分),一眼就能看出第一个事件函数是键盘按下的时候触发,而第二个是键盘按下之后松开时触发的。

我们大多数情况下是用第一个,但是第二个偶尔也有应用场景,大家需要时再查QT助手即可,接下来我们就小小地测试一下键盘按下事件。

#include "Zhetu.h"
#include <qdebug.h>

void Zhetu::keyPressEvent(QKeyEvent* event) {
	qDebug() << "hello world";
}

Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
	this->setFixedSize(650, 400);
}

Zhetu::~Zhetu()
{}

我们每次按下按键的时候都会触发keyPressEvent这个事件函数,但是还有一点,那就是我们目前无法判断我们按下的具体是哪个按键。

这时候我们就需要用到这个函数的参数QKeyEvent了。

我们再用QT助手去找找这个东西。

它有两个方法吸引住了我的目光,一个是key,另一个是text,大概可以猜出来这两个方法可以帮助我们判断我们按下的是什么,我们再来试一试,记得要包含头文件。

#include "Zhetu.h"
#include <qdebug.h>

#include <QKeyEvent>
void Zhetu::keyPressEvent(QKeyEvent* event) {
	qDebug() << event->key() << "    " << event->text();
}

Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
	this->setFixedSize(650, 400);
}

Zhetu::~Zhetu()
{}

可以看的出来key获取的是一个数值,每个按键都对应一个特定的数值,而text可以获取按键的名字。有一个问题就是text只能获取数字和字母的名字,当我按下特殊按键例如上下左右,ctrl,shift等按键时,text返回的就是空字符串了。

综上所述,我们一般使用key这个方法去判断按下的按键是什么。

但是key返回的是数字,看起来很不直观,这个我们再在QT助手中寻找一下有没有解决方法。

什么意思我看不懂,但是大抵可以猜出Qt::Key很关键,我们再次点击链接进去。

接下来便一目了然了,QT为我们准备了很多宏定义来代替那些数值,我们可以使用这些宏定义更直观地来比较通过key获取到的代表按键的数值。

检测鼠标

除了按键之外,我们还有很多关于鼠标的事件函数。

以鼠标移动为例,因为我之前写过一个QT井字棋,在那里面我做了一个设计,那就是鼠标的位置会跟随一个小棋子,那就是通过鼠标移动事件去实现的。

当我们的鼠标移动了,那么这个事件就会触发。当然,更重要的还是我们需要获取到我们的鼠标移动到哪里了,这个就是需要靠这个事件函数的参数QMouseEvent了。

可以看得出来我们主要靠的就是这俩函数,可以帮助我们获取x轴和y轴的坐标,我们来测试一下。

#include "Zhetu.h"
#include <qdebug.h>

#include <QMouseEvent> 

void Zhetu::mouseMoveEvent(QMouseEvent* event) {
	qDebug() << event->x() << "  " << event->y();
}

Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
	this->setFixedSize(650, 400);
}

Zhetu::~Zhetu()
{}

可以发现好像并没有效果,只有当我们鼠标按下的时候移动,这个事件函数才会触发。

那我们想要的实际上是无论我的鼠标什么状态,只要它移动,我都要触发这个函数,那么我们还需要在主界面的构造函数里另外加一行代码。

setMouseTracking(true);

这样,每次鼠标移动的时候就可以触发鼠标移动事件函数了。

那我是怎么知道需要加这一行的呢,答案在这边。

小结

以上就是今天要分享的内容,其他的事件使用起来也大差不差,我们只需要查阅QT助手即可。大家还是需要自己去多加练习。

举报

相关推荐

0 条评论