什么是事件?
点击鼠标左键,双击鼠标左键,鼠标来回移动,按下键盘按钮,这些都是事件。
那么事件的响应机制是什么样的呢?
首先main函数中有一个QApplication,其作用是创建一个应用程序对象,然后该应用程序对象调用exec这个函数,这个函数所起的作用是会在当前应用程序下一直检测是否有事件产生,当有事件产生的时候就会触发一系列的动作。
事件的产生和处理可以分为几个重要的步骤来理解:
1.事件的产生
2.事件过滤
3.事件分发
4.事件处理
首先:
1.事件的产生
我们知道事件产生后,被应用程序对象的exec函数检测到,这个时候应用程序对象会调用一个notify函数,将事件发送到指定的窗口里面去。
2.事件过滤
在事件发送到指定窗口的过程中,我们是可以通过事件过滤器进行过滤的。QObject里面有一个成员函数叫做evenFilter,这个eventFilter是可以过滤掉一些事件的。而且这个eventFilter是一个虚函数,我们是可以对该函数进行重写的,可以在该函数内编辑那些是可以过滤掉的。(默认情况下是不对任何事件进行过滤的),我们翻查Qt助手可以知道,QObject是QApplication的基类,因此QApplication中可以定义事件过滤,因此可以说事件过滤是main函数中的QAppliaction生成的对象a所完成的。
3.事件分发
Qwidget可以对事件进行分发
4.事件处理
Qwidget中有事件处理的函数,是虚函数,可以进行重写。
有图可知,事件发送到指定窗口后,由窗口来对事件进行处理。
上面所说的一系列动作都是自动完成的,这些事件函数都是回调函数,作为使用者来说,我们只需要指定函数的处理动作,关于函数是如何是如何调用的,我们不需要关心。可以理解为是Qt这个框架自动调用的,我们只需要完成调用后执行什么内容。
所以我们只需要重写事件处理函数就可以了,即123步骤由Qt这个框架自动完成。
鼠标点击处理事件重写:
(1)重写QWidget的mousePressEvent事件
1.首先声明方法:
最后实现方法
(由图可知,该坐标轴是以左上角的点来作为圆点的)
注意,只有在Widget界面上面点击鼠标才能其效。
(2)重写QWidget中的mouseReleaseEvent事件处理函数
即我们在窗口中释放鼠标会发生什么,这是释放鼠标的时候提示一下就可以了。
void QWidget::mouseReleaseEvent(MouseEvent *event);//在widget.h文件中进行声明;
//在.cpp文件中进行实现
void Widget::mouseReleaseEvent(MouseEvent *event)
{
qDebug() << "mouse is released.";
}
(3)重写QWidget中的mouseDoubleClickEvent
这里重写mouseDoubleClickEvent方法,做到双击全屏,再双击恢复到原始窗口。
//在widget.h文件下进行声明
void mouseDoubleClickEvent(QMouseEvent *event);
//在widget.cpp文件下进行实现
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)//如果这个双击事件是一个左键的话
{
if(windowState() != Qt::WindowFullScreen)//如果现在窗口的状态不是全屏的话
{
setWindowState(Qt::WindowFullScreen);
}
else
{
setWindowState(Qt::WindowNoState);//如果双击前已经是全屏了则恢复到初始状态
}
}
}
(4)重写QWidget中的mouseMoveEvent
这里重写mouseMoveEvent,实现窗口的拖拽
//在widget.h文件下进行声明
protected:
void wheelEvent(QWheelEvent *event);
//在widget.cpp文件下进行定义
void Widget::wheelEvent(QWheelEvent *event)//注意,这里改成了wheelEvent表示是滚轮的操作
{
if(event->delta() > 0)//delta就是数学中的▲,表示增量
{
ui->textEdit->zoomIn();//往上滚动是聚焦
}
else
{
ui->textEdit->zoomOut();//往下滚动是缩小
}
}
(5)重写QWidget中的wheelEvent
重写QWidget中的wheelEvent,使其通过滚轮改变字体的大小。
先搞一个TextEdit
//在widget.h
void wheelEvent(QWheelEvent *event);
//在widget.cpp
void Widget::wheelEvent(QWheelEvent *event)//注意,这里改成了wheelEvent表示是滚轮的操作
{
if(event->delta() > 0)//delta就是数学中的▲,表示增量
{
ui->textEdit->zoomIn();//往上滚动是聚焦
}
else
{
ui->textEdit->zoomOut();//往下滚动是缩小
}
}
心得:
Qt中的所有宏和枚举量都是在Qt这个类下面的,以后找枚举量去Qt下面找。学习Qt就是要多敲,记住一些常用的方法,记不住就去查Qt小助手,总的来说,现在记不住没关系,用多了就记住了。