1、什么是事件
事件就是某个事情的起因、经过、结果三部分组成一个事件。在QT中,将事件封装成一个类,当我们想要使用一个特定事件的时候,我们只需要把该类实例化成对象,之后使用该对象就是使用该对应的事件。比如QT中常见的类有:鼠标事件(QMouseEvent)、键盘事件(QKeyEvent)、定时器事件(QTimer)、以及图形事件。
2、事件的流程
首先要产生事件、事件的派送、事件的分发、事件的处理,一共4个步骤。打个比方:“你拿100元分给你朋友们买零食吃”事件,产生事件(你拿100元分给你朋友们买零食吃),事件的派送(你需要把钱送到你朋友们那里去)、事件的分发(送到朋友那里之后,你就给每个朋友分一点)、事件的处理(最后你朋友们就拿着你分到的钱去买零食吃),这个列子可能举得不是很好,如果有更好的例子去理解,请发在评论区,我定向大佬们学习。QT的所有事件都是统归QEvent类管理。
(1)、事件的产生:在QT中可以内部产生事件(定事件的时器事件),外部产生的事件(鼠标事件、键盘事件、拖动事件等等)。
(2)、事件的派送:事件的派送都是通过QAPPlication类对事件进行派送的,调用该类里的exec()(模态显示)函数来进入事件的循环状态(监听事件)。
(3)、事件的分发:QT提供一个QEvent类来进行事件的分发,使用QEvent类里的event()函数。
(4)、事件的处理:比如QT常用的处理函数有keypressevent()、mousepressevent()等等。
3、QT中常用的事件处理函数(基于QWidget类),以下都是虚函数,如果要使用,则需要重写
virtual void closeEvent(QCloseEvent * event):窗口关闭事件处理函数
virtual void dragEnterEvent(QDragEnterEvent *event):拖动窗口进入另一个窗口事件处理函数
virtual void dragMoveEvent(QDragMoveEvent *event):拖动窗口事件处理函数
virtual void dragLeaveEvent(QDragLeaveEvent *event):拖动窗口离开另一个窗口事件处理函数
virtual void keypressEvent(QKeyEvnet * event):键盘按下事件处理函数
virtual void mouseDoubleClickEvent(QMouseEvent *event):鼠标双击事件处理函数
virtual void paintEvent(QPaintEvent *event):绘制图形事件处理函数
virtual void timerEvent(QTimerEvent *e) override:当开启定时器则触发该事件
4、内部事件(定时器)
超时信号:void timeout()
超时处理事件:
QTimer *timer = new QTimer; 在堆区实例化对象
超过该时间去处理的其他函数
connect(timer,SIGNAL(timeroout()),this,SLOT(display())); //display()函数是当定时器定时到了就去执行的函数。
timer->start(1000); //设置定时器定时为1S
定时器事件虚函数:virtual void timerEvent(QTimerEvnet *e);
开启定时器并设置定时时间:startTimer(1000);//开启1S的定时器
5、外部事件(鼠标事件、键盘事件)
鼠标关闭窗口处理函数:virtual void closeEvent(QCloseEvent *event);
ignore():忽略该关闭动作
accept():接收该关闭动作
鼠标按下事件处理函数:virtual void mousePressEvent(QMouseEvent *event)
当鼠标按下的时候,触发该事件
例如:
void Dialog::mousePressEvent(QMouseEvent *event)
{
//获取点击的坐标
qDebug()<<"鼠标点击的位置:"<
if(btn==Qt::LeftButton)
{
qDebug()<<"鼠标左键按下"<
}
if(btn==Qt::RightButton)
{
qDebug()<<"鼠标右键按下"<
qDebug()<<"鼠标按下"<
键盘按下事件:virtual void KeyPressEvent(QKeyPressEvent * event)
6、事件过滤器(指定相应的事件通过,其他事件一律不过):bool QObject::eventFilter(QObject *watched,QEvent *event)
注册事件过滤器:installWc=ventFilter(QWidget *widget);
7、事件分发器(QWidget类下的方法)
如果用户重写了事件分发器,那么产生的事件就会派送给事件分发器,这些事件就在事件分发器中处理。
virtual void QWidget::event(QEvent * event);
类型转换函数:static_cast<目的类型>(源类型) //模板函数 :template
8、图形事件
用户在窗口绘制图形的时候会触发该图形事件,绘制图形的类为:QPainter类
有两种情况会自动执行图形事件:
(1)、在窗口初始化第一次显示的时候会执行图形事件
(2)、在窗口刷新或者更新的时候会自动执行图形事件
常用的图形绘制(实现每种图形绘制的方法很多,每个图形只举1函数)
(1)、画点:绘制单个点:void drawPoint(int x,int y);
绘制多个点:void drawPoints(const QPoint * points,int pointCount);
(2)、画线:绘制单条线:void drawLine(int x1,int y1,int x2,int y2);
绘制多条线:void drawLines(const QLine *lines, int lineCount);
(3)、画圆:void drawEllipse(int x,int y,int width,int height);
(4)、画矩形:void drawRect(int x,int y,int weight,int height);
(5)、画扇形:void drawPie(int x, int y, int width, int height, int startAngle, int spanAngle);
startAngle:起始角度
spanAngle:旋转角度
(6)、画弧:void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle);
(7)、画弦:void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle);
9、总结:在学习这节的时候,学得懵懵懂懂,要记的函数很多,但是这么多函数谁记得住呢,所以唯一的办法就是记住在哪一个类中,然后去QT帮助文档里查询相应的方法。如果以上有不对的地方请多多指教。