Qt中的事件学习笔记

news2024/12/25 9:00:48

视频链接

https://www.bilibili.com/video/BV18B4y1K7Cs/?spm_id_from=333.999.0.0&vd_source=fa4ef8f26ae084f9b5f70a5f87e9e41b

事件

Qt主要用来开发带窗口的应用程序,我们使用的窗口的应用程序都是基于时间(比如安卓中的点击事件),其目的是实现回调(这样程序效率才高)
因此Qt为我们提供了一系列事件处理机制。
当窗口事件产生后,事件会经过事件派发->事件过滤->事件经过->事件处理四个阶段
Qt窗口中对一些列的事件都有一些默认的处理动作,如果我们有需要则要对这些事件进行重写
事件跟信号槽很像,个人理解是信号槽像事件的一部分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事件处理器函数

每个控件都有对应的事件处理器函数,要重写这些事件处理器函数则必须要用一个子类去继承QObject或者QWidget或者QWidget的子类,对这些事件处理器函数进行重写,这样我们就可以达到自己想要的效果。
通过官方文档中受保护的函数即可找到对应的时间函数,根据自己的需要重写即可

QEvent函数

在这里插入图片描述
注意:如果调用了ignore函数,则本窗口会对该事件忽略,并将这个事件向上传递给父窗口(Qt的窗口都是一层一层的),直到最外层窗口,若都没有处理,则这个事件就被Qt忽略掉了

重写事件小Demo

mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::closeEvent(QCloseEvent *ev)
{
    //这个question自带两个按钮,一个yes,一个no
   int ret = QMessageBox::question(this,"提问","您是否要关闭窗口");
    if (ret == QMessageBox::Yes)
   {
       ev->accept();//接受事件
   }
    else
    {
        ev->ignore();//忽略事件
   }
}

void MainWindow::resizeEvent(QResizeEvent *ev)
{
    qDebug() << "oldsize: " << ev->oldSize() << "currentsize: " << ev->size();
}

在这里插入图片描述
在这里插入图片描述

自定义按钮

图片最好选择大小相差不大的,否则可能会出现显示不出来的情况
在这里插入图片描述
mybutton.h文件

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>
#include <QEvent>
#include<QMouseEvent>

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);
    void paintEvent(QPaintEvent *ev);//当窗口被刷新的时候,这个事件处理器函数自动被调用
private:
    QPixmap m_pixmap; //专注显示图片,无法对图片进行像素级修改
//    QImage m_img; //常用与多线程中绘图中像素级修改
signals:
};

#endif // MYBUTTON_H

mybutton.cpp文件

#include "mybutton.h"

#include <QPainter>

MyButton::MyButton(QWidget *parent)
    : QWidget{parent}
{
    m_pixmap.load(":/shark1.jpg");//先加载图1
    setFixedSize(m_pixmap.size()); //将按钮的大小设为图片大小
}

void MyButton::mousePressEvent(QMouseEvent *ev)
{
    m_pixmap.load(":/shark2.jpg");//按下加载第二张图片
    update();
}

void MyButton::mouseReleaseEvent(QMouseEvent *ev)
{
    m_pixmap.load(":/shark1.jpg");//释放加载回图1
    update();//调用update函数会导致paintEvent函数被调用
}

void MyButton::enterEvent(QEvent *ev)
{
    m_pixmap.load(":/shark3.jpg");//鼠标悬停加载图3
    update();
}

void MyButton::leaveEvent(QEvent *ev)
{
    m_pixmap.load(":/shark1.jpg");//离开加载图1
    update();
}

void MyButton::paintEvent(QPaintEvent *ev)
{
    //需要绘图要使用QPainter类,构造函数参数是指定绘图设备(即把图画到哪里,但是必须是一个绘图设备类)
    //Qt中每个窗口都可以视为绘图设备类
    QPainter painter(this);
    painter.drawPixmap(rect(),m_pixmap);
}

注意:由于这个按钮控件是自定义控件,在完成对按钮的设计后需要,在ui文件进行添加
1.先找到自定义控件的父类
在这里插入图片描述
2.选择提升为
在这里插入图片描述
3.将自定义控件类名填进下面的这个地方
在这里插入图片描述
4.可以看到变成了Mybutton类型
在这里插入图片描述

为自定义按钮添加自定义信号

自定义信号
在这里插入图片描述
connect连接
在这里插入图片描述
运行结果
在这里插入图片描述
处理编译器的未使用参数的警告
1.直接把事件处理器函数中未用到的参数删掉
2.添加Q_UNUSED宏

在这里插入图片描述
结果:编译器未输出警告信息
在这里插入图片描述

注意

若自定义事件处理函数重写了父类的虚函数,则父类的虚函数就无法执行了
如果还想在子类中执行父类的虚函数该怎么做呢?

父类名直接访问对应的事件处理器函数,这样相当于在我们自定义的控件中处理了我们自定义的处理动作后,再进行父类对应处理动作的执行,看具体需求

如:这个自定义按钮继承的是QPushbutton类或其他按钮类,当这个按钮被点击时会发出一个clicked()信号,这时我们需要调用原本父类的mousePressEvent函数,这样这个信号才会被发射出去(即如果是继承的是QPushbutton类或其他按钮类则不需要自定义信号,只需要调用原本父类的事件处理器函数就能实现自定义信号的功能)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】机器学习创建算法第4篇:K-近邻算法,学习目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法&#xff0c;1.4 …

手术麻醉系统源码 医疗信息管理系统源码C#.net6.0+ vs2022,vscode+BS网页版 手麻系统源码

手术麻醉系统源码 医疗信息管理系统源码C#.net6.0 vs2022,vscodeB/S网页版 手麻系统源码 手术麻醉管理系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&…

第四百四十三回

文章目录 1. 概念介绍2. 思路与方法2.1 整体思路2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义Action菜单"相关的内容&#xff0c;本章回中将介绍如何获取屏幕相关参数.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

【面试八股总结】进程(一)

参考资料 &#xff1a;小林Coding、阿秀、代码随想录 一、什么是进程&#xff1f; 1. 基本概念 进程是具有独立功能的程序在一个数据集合上运行的过程&#xff0c;是系统进行资源分配和调度的一个独立单位。 2. 进程控制块 系统通过进程控制块PCB描述进程的进本情况…

[Spring Cloud] gateway全局异常捕捉统一返回值

文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…

vue3中实现文本显示省略号和tooltips提示框

前言 在 B 端业务中&#xff0c;我们经常会遇到文本内容超出容器区域需显示省略号的需求。当鼠标移入文本时&#xff0c;会出现 Tooltip 显示完整内容。最近&#xff0c;我也遇到了这样的场景。为了提高业务通用性&#xff0c;我已将其封装为组件、Hook 和指令等形式供使用。 …

从0到1实现RPC | 04 负载均衡和静态注册中心

一、Router的定义 Router路由用于预筛选&#xff0c;Dubbo有这样的设计&#xff0c;SpringCloud没有。 二、LoadBanlancer定义 负载均衡器&#xff1a;默认取第一个 当前支持随机和轮询两种负载均衡器。 随机&#xff1a;从所有provider中随机选择一个。 轮询&#xff1a;每…

如何选择优质的静动态住宅代理IP提供商

在从事跨境电商业务时选择优质的静动态住宅代理IP提供商是一个涉及多个方面考量的过程。在进行选择时&#xff0c;需要综合考虑多种因素&#xff0c;以确保选择的提供商能够满足您的需求并提供稳定、可靠的服务。以下是一些建议&#xff0c;以帮助您进行选择&#xff1a; 第一…

js中使let关键字报错,改用var关键字解决

js中使let关键字报错,改用var关键字解决 项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;总结 项目场景&#xff1a; 使用 let 关键字报错&#xff0c;报错信息为&#xff1a; Uncaught ReferenceError: maxNum is not defined at getMaxNum (4-3.htm…

独角数卡对接支付卡跳转问题解决方法

问题描述 最近在用独角数卡搭建了一个测试版的商店程序&#xff0c;结果却在对接易支付的过程中出现了卡跳转的问题&#xff0c;支付能正常完成&#xff0c;订单发卡也正常&#xff0c;就是会卡在这个弹窗页面无法正常跳转至订单查看页面。 本来这种BUG无关痛痒&#xff0c;但…

蓝桥杯(5):python动态规划DF[2:背包问题]

1 0-1背包介绍【每件物品只能拿1件或者不拿】 1.1 简介 贪心是不可以的&#xff01;&#xff01;&#xff01; 1.2 状态 及状态转移 转移解释&#xff1a;要么不选 则上一个直接转移过来【dp[i-1][j]】&#xff0c;要么是选这个之后体积为j 则上一个对应的就是【dp[i-1][j-wi]…

阿里云邮件服务器多少钱?邮件服务器租用费用

阿里云邮件服务器租用费用&#xff0c;2核2G3M带宽99元一年、2核4G4M服务器199元一年&#xff0c;不只是云服务器ECS&#xff0c;还可以选择轻量应用服务器。 0、在阿里云CLUB中心领取 aliyun.club 当前最新的优惠券和服务器报价单 1、阿里云服务器ECS经济型e实例&#xff0c;2…

leetcode代码记录(买卖股票的最佳时机

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股…

导入项目运行后,报错java: Cannot find JDK ‘XX‘ for module ‘XX‘

解决方案&#xff1a; 1、删除.idea和.iml文件 2、右击此module&#xff0c;点击 Open Module Settings 在 Module SDK 中选择所安装的java版本后&#xff0c;点击右下角 Apply 3、再运行试试吧&#xff0c;成功&#xff01;

Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…

金陵科技学院软件工程学院软件工程专业

感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦~~ 感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦~~ 感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦~~ 感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦…

大数据基础设施搭建 - Spark

文章目录 一、解压压缩包二、修改配置文件conf/spark-env.sh三、测试提交Spark任务四、Spark on Hive配置4.1 创建hive-site.xml&#xff08;spark/conf目录&#xff09;4.2 查看hive的hive-site.xml配置与3.1配置的是否一致4.3 测试SparkSQL4.3.1 启动SparkSQL客户端&#xff…

Qtxlsx第三方库的安装和使用

本文仅作为一个记录&#xff0c;安装QtXlsx方便操作excel&#xff0c;主要参考了这篇博文&#xff1a;https://blog.csdn.net/u014779536/article/details/111769792 1&#xff0c;下载安装Perl脚本Strawberry Perl for Windows&#xff0c;默认安装strawberry-perl-5.30.0.1-…

AcWing1402.星空之夜

【题目链接】1402. 星空之夜 - AcWing题库 夜空深处&#xff0c;闪亮的星星以星群的形式出现在人们眼中&#xff0c;形态万千。 一个星群是指一组非空的在水平&#xff0c;垂直或对角线方向相邻的星星的集合。 一个星群不能是一个更大星群的一部分。 星群可能是相似的。 如…

力扣面试150 加油站 贪心 找规律

Problem: 134. 加油站 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) &#x1f496; 贪心 &#x1f468;‍&#x1f3eb; 参考题解 class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int n gas.length…