今天聊聊事件,实际上我们在前两篇文章中就已经接触到了事件,分别是定时器事件和绘画事件,今天我们再来看看其他的事件。
我们打开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助手即可。大家还是需要自己去多加练习。