Qt -- 事件

视频学习链接: https://www.bilibili.com/video/BV18B4y1K7Cs.
笔记参考链接:https://subingwen.cn/qt/event_handler/.

一、事件的相关知识

一、什么是事件

事件是由程序内部或者外部产生的某种动作,比如用户按下键盘或者鼠标,产生一个键盘事件或者鼠标事件(程序外部产生)。比如操作窗体改变大小,则会产生一个绘制的事件,从而重新绘制其自身(程序内部产生)。

二、为什么要用事件?

众所周知 Qt 是一个基于 C++ 的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流)。我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在 Qt 框架内部为我们提供了一些列的事件处理机制,当窗口事件产生之后,事件会经过:事件派发 -> 事件过滤->事件分发->事件处理 几个阶段。Qt 窗口中对于产生的一系列事件都有默认的处理动作,如果我们有特殊需求就需要在合适的阶段重写事件的处理动作。

三、信号和事件的区别?

信号是对象产生的,而事件既可以同步使用,也可以异步使用。事件的出现,使得程序代码不会按照之前的线性的顺序执行,事件处理的是复杂的用户交互。

四、Qt 应用程序为什么能够检测事件?

每一个 Qt 应用程序都对应一个唯一的 QApplication 应用程序对象,然后调用这个对象的 exec() 函数,这样 Qt 框架内部的事件检测就开始了(程序将进入事件循环来监听应用程序的事件)。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow* w = new MainWindow;
    w.show();
    return a.exec();
}

四、事件在 Qt 中产生之后,的分发过程是这样的:
在这里插入图片描述

二、事件处理器函数

在这里插入图片描述
视频中除了介绍上面几种事件及其相应的事件处理器函数,还介绍了定时器及其这个事件的事件处理器函数 timerEvent 定义的位置。

在帮助文档中搜索 QObject ,然后点击 Protected Functions,
在这里插入图片描述
在这里插入图片描述
其他的事件及其这些事件的事件处理器函数可用上面同样的方法,搜索 QWidget,然后点击 Protected Functions。
在这里插入图片描述
需要注意,这些事件处理器函数他们是被 QT 框架调用的,并且有默认的处理动作。

三、重写事件处理器函数

3.1 在子类中重写父类的关闭事件

新建一个工程,SerialMainWindow 是 QMainWindow 派生的一个子类
在这里插入图片描述
这些虚函数的访问权限都是受保护的,
在这里插入图片描述
在这里插入图片描述
下面再来看一看 QCloseEvent 这个类,
在这里插入图片描述
QCloseEvent 它继承与 QEvent 这个类,QCloseEvent 没有什么 API 函数,来看QEvent 这个类。
在这里插入图片描述

void SerialMainWindow::closeEvent(QCloseEvent *ev)
{
   int ret = QMessageBox::question(this,"提问","您确定要关闭窗口吗?");
   if(ret == QMessageBox::Yes)
   {
       ev->accept();
   }
   else
   {
       ev->ignore();
   }
}

3.2 在子类中重写父类的 resizeEvent 事件

在这里插入图片描述
oldSize 是返回窗体变化之前的尺寸信息,size 是返回当前窗口的尺寸信息。

在 mainwindow.h 中

protected:
    void resizeEvent(QResizeEvent* ev);

在 mainwindow.cpp 中

void SerialMainWindow::resizeEvent(QResizeEvent *ev)
{
    qDebug()<<"oldSize:"<<ev->oldSize()<<"currSize:"<<ev->size();
}

代码运行如下:
在这里插入图片描述

四、基于事件处理器函数自定义按钮

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在 mybutton.h 中定义一个 QPixmap 类的对象;

private:
    QPixmap m_pixmap;

添加资源文件
在这里插入图片描述
在这里插入图片描述
点击 Ctrl + S 保存,之后,就可以看到添加进来了。
在这里插入图片描述
在这里插入图片描述
在 mybutton.h 中

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>

class myButton : public QWidget
{
    Q_OBJECT
public:
    explicit myButton(QWidget *parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent*ev);
    void mouseReleaseEvent(QMouseEvent*ev);
    void enterEvent(QEvent*ev);
    void leaveEvent(QEvent*ev);
signals:

private:
    QPixmap m_pixmap;

};

#endif // MYBUTTON_H

在 mybutton.cpp 中

#include "mybutton.h"

myButton::myButton(QWidget *parent) : QWidget(parent)
{
    //当按钮没有任何操作时,需要显示默认的第一张图片
    m_pixmap.load(":/res/dragon.jpg");
}

void myButton::mousePressEvent(QMouseEvent *ev)
{
    //当按钮按下的时候,显示第二张图片
    m_pixmap.load(":/res/dog.jpg");
}

void myButton::mouseReleaseEvent(QMouseEvent *ev)
{
    //当按钮释放的时候,恢复显示第一张图片
    m_pixmap.load(":/res/dragon.jpg");
}

void myButton::enterEvent(QEvent *ev)
{
    //当鼠标悬停的时候,显示第三张图片
    m_pixmap.load(":/res/pig.jpg");
}

void myButton::leaveEvent(QEvent *ev)
{
    //当鼠标离开控件的时候,恢复显示第一张图片
    m_pixmap.load(":/res/dragon.jpg");
}

现在图片已经加载进来了,那怎样将其重新到当前按钮上面去呢?

这就需要使用到一个刷新函数 paintEvent ,这个函数并不是手动调用的,而是在窗体需要被刷新的时候,才会被 QT 框架自动调用。

分别在 mybutton.h 和 mybutton.cpp 中进行声明和定义。

protected:
	xxx;
	void paintEvent(QPaintEvent* ev);
void myButton::paintEvent(QPaintEvent *ev)
{
    
}

接下来,我们要把我们自定义的 myButton 这个控件给显示到当前窗体 (ui)上,我们首先来看一看 myButton 这个类的基类是什么?这里我们在新建的时候,指定了是 QWidget ,因此,就要在当前 ui 文件上先拖拽一个 Widget 控件。如下图所示。
在这里插入图片描述
在这里插入图片描述
此时,可以看到
在这里插入图片描述
其实呢,这个提升的过程就是将基类给变成子类,这样就将自定义控件给添加到 ui 窗口了。

(这里,关于案例的记录没有记录完,但是已经将代码上传到CSDN了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xuechanba

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

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

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

打赏作者

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

抵扣说明:

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

余额充值