QT5之事件——包含提升控件

事件概述

 信号就是事件的一种,事件由用户触发;

鼠标点击窗口,也可以检测到事件;产生事件后,传给事件处理,判断事件类型,后执行事件相应函数;

类似单片机的中断(中断向量);

事件实验

工程准备

创建Qwidget基类工程且带UI

ui添加一个标签,这个标签拉得足够大,因为要显示

添加一个类文件Qwidget基类型的

更换为QLabel的基类

添加虚拟函数,属于保护类型;

输入void mousePressEvent(QMouseEvent *ev);如果参数不显示,删除括号且之后的删除;然后重新打括号

mylable.h

#ifndef MYLABLE_H
#define MYLABLE_H#include <QWidget>
#include<QLabel>
#include<QMouseEvent>
class MyLable : public QLabel
{Q_OBJECT
public:explicit MyLable(QWidget *parent = 0);
protected:void mousePressEvent(QMouseEvent *ev);void mouseReleaseEvent(QMouseEvent *ev);void mouseMoveEvent(QMouseEvent *ev);signals:public slots:
};#endif // MYLABLE_H

mylable.c

#include "mylable.h"
#include<QString>
#include<QDebug>
MyLable::MyLable(QWidget *parent) : QLabel(parent)
{this->setMouseTracking(true);//默认追踪鼠标,一开始不用点击窗口,就在追踪了
}void MyLable::mousePressEvent(QMouseEvent *ev)
{int i=ev->x();int j=ev->y();if(ev->button()==Qt::LeftButton)//左键{qDebug()<<"LeftButton";}else if(ev->button()==Qt::RightButton)//右键{qDebug()<<"RightButton";}else if(ev->button()==Qt::MidButton)//中间按键{qDebug()<<"MidButton";}//居中加粗指令QString str=QString("<center><h1>press mouse:(%1 ,%2)</h1></center>").arg(i).arg(j);this->setText(str);//设置标签内容为strqDebug()<<str;
}void MyLable::mouseReleaseEvent(QMouseEvent *ev)
{}void MyLable::mouseMoveEvent(QMouseEvent *ev)
{}

<center>     </center>    //居中指令  后面加的 /属于闭合标记,相当于括号的最后一半括号

<h1>     </h1>  //加粗指令      后面加的 /属于闭合标记,相当于括号的最后一半括号

 %1 %2 属于参数 1 和参数2; .arg(i) .arg(j) //添加对应变量

类提升

之前的标签基类,就变成了代码标签基类;

这个标签就成为了代码写的那个标标签;就可以显示文字了;

没有这个提升,就意味标签类不同,代码和UI的标签不是一个标签;

按键事件+定时器事件

开始一个定时器,分辨率为1ms 返回一个定时器ID

//停止定时器,只能使用kill

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mylable.h"
#include<QKeyEvent>//按键事件头
#include<QDebug>
#include<QTimerEvent>//定时器事件头
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ID1_time =this->startTimer(1000);//开始一个定时器,分辨率为1ms 返回一个定时器ID
}Widget::~Widget()
{delete ui;
}void Widget::keyPressEvent(QKeyEvent *e)//按键事件处理函数
{qDebug()<< (char)e->key();//打印按键if(e->key()==Qt::Key_A)//按键时这个就打印{qDebug()<< "Qt::Key_A";}}void Widget::timerEvent(QTimerEvent *t)//定时器事件处理函数
{if(t->timerId()==ID1_time)//判断当前的ID{static int time_counter;qDebug()<< time_counter++;if(time_counter==10){this->killTimer(ID1_time);//停止定时器,只能使用kill}}
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTimerEvent>
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected://虚拟函数,都使用保护void keyPressEvent(QKeyEvent *e);//虚拟函数,按键事件void timerEvent(QTimerEvent *t);//虚拟函数,定时器事件private:Ui::Widget *ui;int ID1_time;//定时器ID
};#endif // WIDGET_H

按钮事件的接收和忽略

事件相当于信号量;使用就没有了;

新建一个类MyButton属于Qwidget基类;

把新建的构造函数和基类改成继承于QPushButton;

ui放一个按钮提升类

设计一个按键和处理信号,和一个事件

实验结果:connet按键的信号相当于一个按下事件,但是被鼠标事件占用了,所以按键的信号等不到了;

所以按键connet的事件是等待不到的,事件被使用具有消耗性;

如下是按键的鼠标按下事件

如下是按键按下信号和槽

按钮按下相当于事件。但是鼠标按下事件已经接受;所以传递不了给下方这个了;

所以下方无法被打印

事件传递只能传递给父类组件(父类窗口)

使用e->accept();//接收事件,事件不会向下传递

 e->ignore();//忽略事件,事件会向下传递

代码设计为

按键的鼠标按下事件

void MyButton::mousePressEvent(QMouseEvent *e)
{if(e->button()== Qt::LeftButton){qDebug()<<"鼠标左按键被按下";e->ignore();//忽略事件,传递给父组件,也就是主窗口;//一般使用在关闭窗口,关闭窗口的时候,让事件传递;//没有ignore,也就是信号已经被这个处理,信号相当于信号量,使用就没有了}else//否则左键没被按下 ,不做处理{QPushButton::mousePressEvent(e);//没被按下,就传递给父组件}}

父类的鼠标按下


void Widget::mousePressEvent(QMouseEvent *e)
{qDebug()<<"+++++++++++++++++++";
}void Widget::closeEvent(QCloseEvent *e)
{int reg=QMessageBox::question(this,"question","是否需要关闭窗口");if(reg==QMessageBox::Yes){e->accept();//接收事件,事件不会向下传递}else{e->ignore();//忽略事件,事件会向下传递}}

event事件分发

事件分发分类分发给相应的事件处理函数;每个控件一个event。

在widget.h添加个

protected:

bool event(QEvent *e);//事件分发器 ,返回true就是说明事件已经被处理,停止向下传播

在widget.c分发器

bool Widget::event(QEvent *e)//
{//事件按照类型分发switch (e->type()) {case QEvent::Close:closeEvent(e);break;case QEvent::KeyPress:keyPressEvent(e);break;default:break;} ;if(e->type() == QEvent::Timer){QTimerEvent *env= static_cast<QTimerEvent * >(e);timerEvent(  env);//处理定时事件 屏蔽这个,永远不会分发return true;//返回true  表明事件被处理}else if(e->type() == QEvent::KeyPress)//事件是按键类型{QKeyEvent *env=static_cast<QKeyEvent*>(e) ; if(env->key()==Qt::Key_B) {qDebug()<<"bbbbbBBBB";}}else{return QWidget::event(e);//转发事件,继续下流事件}}

事件分发和过滤之间的关系:

过滤器

过滤器好处:不用单独给某个控件写事件分配EVENT;在过滤器里面可以,写一个EVENT程序,同时给多个器件使用;

成员的保护类添加如下

 bool eventFilter(QObject *obj, QEvent *e);//过滤器   过滤的obj控件  e过滤的事件

返回ture 就是停止过滤,过滤完成 ,flase  未过滤完成;

过滤器代码

bool Widget::eventFilter(QObject *obj, QEvent *e)
{if(obj== ui->pushButton)//这里可以并多个器件,相对写单个EVENT{if(e->type() == QEvent::MouseButtonPress){qDebug()<<"  鼠标被按下  ";//处理return true;//已经处理,不会继续传播}else{return QWidget::eventFilter(obj,e);//继续传播}}else{return QWidget::eventFilter(obj,e);//则继续传递下去}}

补充知识点:

类型转换:

 QTimerEvent *env= static_cast<QTimerEvent* >(e);

static_castt< >转换指令  ,符号里面是需要转换成的目标类型,(e)中的e是当前被转化数据;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 入门与实践:从零开始构建容器化应用环境

Docker 一、docker常用命令docker ps 格式化输出Linux设置命令别名 二、数据卷相关命令挂载到默认目录&#xff08;/var/lib/docker&#xff09;挂载到本地目录 三、自定义镜像Dockerfile构建镜像的命令 四、网络自定义网络 五、DockerCompose相关命令 一、docker常用命令 dock…

Superset二次开发之Legend功能优化

背景 Legend数据太长,影响整体图表体验,为改善用户体验,需要实现:1.数据省略展示,‘...’表示,鼠标悬停时,展示完整信息 2:文本内容从左向右滚动展示 柱状图优化 柱状图来自第三方Echarts插件,效果展示 功能核心在于红框的内容 option = {tooltip: {trigger: item,ax…

软件杯 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

Vue3+Nuxt3 从0到1搭建官网项目(SEO搜索、中英文切换、图片懒加载)

Vue2Nuxt2 从 0 到1 搭建官网~ Vue3Nuxt3 从0到1搭建官网项目 安装 Nuxt3&#xff0c;创建项目初始化的 package.json项目结构初始化项目pages 文件下创建index.vue引入sass修改 app.vue 文件查看效果 配置公共的css、metaassets下的cssreset.scss 重置文件common.scss 配置nux…

CTF-WEB(MISC)

安全攻防知识——CTF之MISC - 知乎 CTF之MISC杂项从入门到放弃_ctf杂项 你的名字-CSDN博客 CTF MICS笔记总结_archpr 掩码攻击-CSDN博客 一、图片隐写 CTF杂项---文件类型识别、分离、合并、隐写_ctf图片分离-CSDN博客 EXIF&#xff08;Exchangeable Image File&#xff09;是…

考虑极端天气线路脆弱性的配电网分布式电源和储能优化配置模型

1 主要内容 程序主要参考《考虑极端天气线路脆弱性的配电网分布式电源配置优化模型-马宇帆》&#xff0c;针对极端天气严重威胁配电网安全稳定运行的问题。基于微气象、微地形对配电网的线路脆弱性进行分析&#xff0c;然后进行分布式电源接入位置与极端天气的关联性分析&…

​【收录 Hello 算法】第 3 章 数据结构

第 3 章 数据结构 Abstract 数据结构如同一副稳固而多样的框架。 它为数据的有序组织提供了蓝图&#xff0c;算法得以在此基础上生动起来。 本章内容 3.1 数据结构分类3.2 基本数据类型3.3 数字编码 *3.4 字符编码 *3.5 小结

Java | Leetcode Java题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; class Solution {public int[][] generateMatrix(int n) {int num 1;int[][] matrix new int[n][n];int left 0, right n - 1, top 0, bottom n - 1;while (left < right && top < bottom) {for (int column left; co…

uniapp:K线图,支持H5,APP

使用KLineChart完成K线图制作,完成效果: 1、安装KLineChart npm install klinecharts2、页面中使用 <template><view class="index"><!-- 上方选项卡 --><view class="kline-tabs"><view :style="{color: current==ite…

《动手学深度学习(Pytorch版)》Task03:线性神经网络——4.29打卡

《动手学深度学习&#xff08;Pytorch版&#xff09;》Task03&#xff1a;线性神经网络 线性回归基本元素线性模型损失函数随机梯度下降 正态分布与平方损失 线性回归的从零开始实现读取数据集初始化模型参数定义模型定义损失函数定义优化算法训练 线性回归的简洁实现读取数据集…

【c++】Resharper 去掉中文注释拼写

参考大神&#xff1a; Resharper 去掉注释拼写 reshaper的中文注释一堆下划线&#xff0c;看的很累、很乱&#xff1a; options 里 在code inspetion里 搜索 去掉 Typo in comment 就可以不在中文注释提示 重启vs reshaperd 中文注释下划线没了。小番茄的还在。

jsPDF + html2canvas + Vue3 + ts项目内,分页导出当前页面为PDF、A 页面内导出 B 页面的内容为PDF,隐藏导出按钮等多余元素

jsPDF html2canvas Vue3 ts Arco Design项目&#xff0c;分页导出当前页面为PDF、A 页面内导出 B 页面的内容为PDF&#xff0c;隐藏导出按钮等多余元素… 1.下载所需依赖 pnpm install --save html2canvaspnpm install --save jspdf引入依赖 <script setup lang"…

2010NOIP普及组真题 3. 导弹拦截

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1951 核心思想&#xff1a; 1、我们把导弹分为区间1和区间2来看。1#拦截区间1&#xff0c;2#拦截区间2。 2、则&#xff1a;1#的拦截半径为区间1 中 最远的导弹&#xff0c;而2#的拦截半…

关于 c++的模板库中的数组模板 is_array_v的测试

&#xff08;1&#xff09;该模板的源代码如下&#xff1a; template <class> // determine whether type argument is an array bool is_array_v false;template <class _Ty, size_t _Nx> bool is_array_v<_Ty[_Nx]> true;template <class _Ty>…

学习java中的interface接口

1.了解接口 java提供了一个关键字interface&#xff0c;用这个关键字我们可以定义出一个特殊的结构&#xff1a;接口 格式&#xff1a; public interface 接口名{ //成员变量&#xff08;常量&#xff09; //成员方法&#xff08;抽象方法&#xff09; } 注意&#xff1a;接…

Python——Fastapi管理平台(打包+优化)

目录 一、配置多个表 1、后端项目改造 2、导包报错——需要修改&#xff08;2个地方&#xff09; 3、启动后端&#xff08;查看是否有问题&#xff09; 4、配置前端 二、打包——成exe文件&#xff08;不包含static文件&#xff09;简单 1、后端修改 2、前端修改 3、运行打包命…

[论文笔记]Longformer: The Long-Document Transformer

引言 今天带来论文Longformer: The Long-Document Transformer的笔记。 基于Transformer的模型由于其自注意力操作而无法处理长序列&#xff0c;该操作随着序列长度呈二次扩展。为了解决这一限制&#xff0c;本篇工作提出了Longformer&#xff0c;其注意力机制随着序列长度呈…

批量邮箱API发送邮件的方法?如何使用API?

批量邮箱API发送邮件效率怎么样&#xff1f;API接口发信的优势&#xff1f; 批量发送邮件已经成为许多企业、机构或个人进行营销推广、信息传递的重要手段。然而&#xff0c;如何高效、准确地实现批量邮箱发送&#xff0c;却是许多人面临的难题。AokSend就来探讨一下利用API进…

Python基础学习之logging模块

在Python编程中&#xff0c;日志记录&#xff08;Logging&#xff09;是一个非常重要的功能。它不仅可以帮助我们追踪和调试代码中的错误&#xff0c;还可以记录程序运行时的关键信息&#xff0c;以便后续分析和优化。Python标准库中的logging模块为我们提供了强大的日志记录功…

C++从入门到精通——模板

模板 前言一、泛型编程二、函数模板函数模板的概念函数模板格式示例 函数模板的原理函数模板的实例化隐式实例化显式实例化示例 auto做模板函数的返回值模板参数的匹配原则总结 三、类模板类模板的定义格式类模板的实例化 前言 C模板是C语言中的一种泛型编程技术&#xff0c;可…