• QT 学习笔记(八)


    由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
    提示:具体项目创建流程和注意事项见QT 学习笔记(一)
    提示:具体项目准备工作和细节讲解见QT 学习笔记(二)

    一、事件

    • 生成一个新的项目,具体步骤过程见提示。

    1. 事件简介

    • 事件(event)是由系统或者 QT 本身在不同的时刻发出的。
    • 当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
    • 一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
    • QT 程序需要在 main() 函数创建一个 QApplication 对象,然后调用它的 exec() 函数。这个函数就是开始 QT 的事件循环。
    • 在执行 exec() 函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,QT 将创建一个事件对象。
    • QT 中所有事件类都继承于QEvent。
    • 在事件对象创建完毕后,QT 将这个事件对象传递给 QObject 的 event() 函数。 event() 函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。

    2. 常见事件

    • 在所有组件的父类 QWidget 中,定义了很多事件处理的回调函数。
    函数功能
    keyPressEvent()键盘按下
    keyReleaseEvent()键盘抬起
    mouseDoubleClickEvent()鼠标双击
    mouseMoveEvent()鼠标移动
    mousePressEvent()鼠标按下
    mouseReleaseEvent()鼠标抬起
    • 上述函数并不完全,只是其中一部分,具体函数见帮助文档。

    在这里插入图片描述

    二、实际演示

    • 新建一个项目(本处选择的是 QWidget 基类)。
    • 在 ui 界面插入一个 Label 标签。

    在这里插入图片描述

    • 在这里要注意的是,现在这个控件是 QLabel,而我们这里是 MyLabel ,MyLabel 需要继承于 QLabel ,一对一匹配。涉及到 自定义控件提升详见QT 学习笔记(七)
    • 因此,在这里需要新建一个 C++ 类。
    • 事件的很多回调函数都是 protected(被保护类),具体示例如下:

    在这里插入图片描述

    1. mousePressEvent 鼠标点击事件

    • 可以通过 if 语句对鼠标是左键、右键还是中间进行判断。
    • 代码如下:
    //鼠标点击事件
    void mylabel::mousePressEvent(QMouseEvent *ev)
    {
        int i=ev->x();
        int j=ev->y();
        //sprinf 字符串格式化命令
        /* 
         * QString str = QString("abc %1 ^_^ %2").arg(123).arg("mike");
         * str = abc 123 ^_^ mike
        */
        
        QString text = QString("

    mouse press:(%1,%2)

    "
    ) .arg(i).arg(j); // center 居中,h1 一级标题 this->setText(text); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 当鼠标在 ui 界面单击时,会实时显现我们鼠标点击的坐标,现象如下图所示:

    在这里插入图片描述

    2. mouseReleaseEvent 鼠标释放事件

    • 代码如下:
    //鼠标释放事件
    void mylabel::mouseReleaseEvent(QMouseEvent *ev)
    {
        QString text = QString("

    mouse release:(%1,%2)

    "
    ) .arg(ev->x()).arg(ev->y()); this->setText(text); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 当鼠标在 ui 界面单击释放时,会实时显现我们鼠标释放的坐标,现象如下图所示:

    在这里插入图片描述

    3. mouseMoveEvent 鼠标移动事件

    • 代码如下:
    //鼠标移动事件
    void mylabel::mouseMoveEvent(QMouseEvent *ev)
    {
        QString text = QString("

    mouse move:(%1,%2)

    "
    ) .arg(ev->x()).arg(ev->y()); this->setText(text); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 当鼠标在 ui 界面移动时,会实时显现我们鼠标所在位置的坐标,现象如下图所示:

    在这里插入图片描述

    4. enterEvent 进入窗口区域

    • 代码如下:
    //进入窗口区域
    void mylabel::enterEvent(QEvent *e)
    {
        QString text = QString("

    mouse enter

    "
    ); this->setText(text); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 当鼠标进入 ui 界面时,会显现出 mouse enter,现象如下图所示:

    在这里插入图片描述

    5. leaveEvent 离开窗口区域

    • 代码如下:
    //离开窗口区域
    void mylabel::leaveEvent(QEvent *e)
    {
        QString text = QString("

    mouse leave

    "
    ); this->setText(text); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 当鼠标离开 ui 界面时,会显现出 mouse leave,现象如下图所示:

    在这里插入图片描述

    6. 键盘按下事件

    • 代码如下:
    //键盘按下事件
    void myWidget::keyPressEvent(QKeyEvent *e)
    {
        qDebug()<<(char)e->key();
        if(e->key()==Qt::Key_A)
        {
            qDebug()<<"Qt::Key_A";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 当我在窗口按下键盘时,在输出窗口会输出其对应的 ASCII 码值。

    在这里插入图片描述

    7. 计时器事件

    • 计时器就像定时器,在我们的日常生活当中很常用,譬如闹钟,ppt上的计数都是通过定时器实现。
    • 在这里,计时器启动 startTimer() ;以毫秒为单位,每 1s 触发一次,现象如下图所示:

    在这里插入图片描述

    • 计时器停止 killTimer();现象如下图所示:

    在这里插入图片描述

    • 两个计时器同时工作

    在这里插入图片描述

  • 相关阅读:
    B2C在线教育商城--前后端分离部署
    搭建nfs
    2022.7.2 Linux——网络相关知识
    `useState` 和 `useImmer` 都是 React 中用于管理状态的钩子
    香港服务器ssh连接失败怎么处理?
    世界前沿技术发展报告2023《世界航天技术发展报告》(二)卫星技术
    torch.meshgrid() 函数理解
    日期类的实现
    TodoList案例
    机器学习-学习笔记(一) --> (假设空间 & 版本空间)及 归纳偏好
  • 原文地址:https://blog.csdn.net/weixin_45891612/article/details/128191676