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.mzph.cn/web/7530.shtml

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

相关文章

Dask简介

目录 一、概述 二、编程模型 2.1 High-Level Collection 2.2 Low level Interface 三、调度框架 3.1 任务图 3.2 调度 3.3 优化 3.4 动态任务图 一、概述 Dask是一个灵活的Python并行计算库。 Dask由两部分组成&#xff1a; 为计算优化的动态任务调度&#xff1a;和A…

翻译《The Old New Thing》 - What is the deal with the ES_OEMCONVERT flag?

What is the deal with the ES_OEMCONVERT flag? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20050719-12/?p34893 Raymond Chen 在 2005年07月19日 ES_OEMCONVERT 标志是怎么回事&#xff1f; 简要 文章讨论了 ES_OEMCONVERT 编辑控件风格的起源和用途…

linux学习:线程池

目录 原理 初始线程池 运行中的线程池 相关结构体 api 线程池初始化 投送任务 增加活跃线程 删除活跃线程 销毁线程池 例子 thread_pool.h thread_pool.c test.c 测试程序 原理 一个进程中的线程就好比是一家公司里的员工&#xff0c;员工的数目应该根据公司的…

数据库数据恢复—SQL Server数据库ndf文件变为0KB的数据恢复案例

SQL Server数据库故障&#xff1a; 存储设备损坏导致存储中SQL Server数据库崩溃。对数据库文件进行恢复后&#xff0c;用户发现有4个ndf文件的大小变为0KB。该SQL Server数据库每10天生成一个大小相同的NDF文件&#xff0c;该SQL Server数据库包含两个LDF文件。 SQL Server数据…

优思学院|HR部门如何制定公司的精益六西格玛培训计划?

在许多企业中&#xff0c;精益六西格玛作为一种提升效率和质量的重要方法论&#xff0c;越来越受到重视。HR部门在推广和实施精益六西格玛培训计划中其实也扮演着关键角色。以下是HR部门可以采取的几个步骤&#xff0c;以有效地制定和实施这样的培训计划。 1. 需求分析 首先&…

Mybatis进阶3--注解开发

先看&#xff1a; Mybatis进阶1-CSDN博客 Mybatis进阶2-CSDN博客 mybatis注解开发 前置&#xff1a;不需要xxxMapper..xml文件&#xff08;映射文件&#xff09; 在核心配置文件中&#xff1a;<mappers>标签只能使用&#xff1a;<package name"扫描的包&quo…

25考研英语长难句Day01

Day01 【思考】&#xff1a;本句中有几处平行结构&#xff1f;分别是什么和什么平行并列呢&#xff1f;【生词、词组】【断开、简化】&#xff08; 两步分析法&#xff09;断开长难句的三步法&#xff1a;标点、连接词、分析主谓平行结构 【思考】&#xff1a;本句中有几处平行…

Who calls ActivityRecord#removeIfPossible

activityDestroyed when you call finish . ActivityClientController#activityDestroyed ActivityRecord#destroyed app died:

手把手教你响应式网页设计:详细指南

响应式设计是如今网页设计的大趋势&#xff0c;现在已经成为网页设计师学习的焦点。响应式网页设计考虑到多平台、多种屏幕尺寸的情况&#xff0c;能够优化多种设备的网络浏览体验。在进行响应式设计时&#xff0c;要专门针对内容进行设计&#xff0c;优先考虑在不同环境下内容…

机器学习之基于Python多种混合模型的糖尿病预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 糖尿病是一种慢性代谢性疾病&#xff0c;其发病率在全球范围内逐年上升&#xff0c;已成为影响人类健…

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

在Pycharm中使用ARCGIS Pro提供的python.exe或者ArcPy

在安装了ArcGIS Pro后,如果需要在Pycharm中使用Pro提供的python.exe或者ArcPy,还需要进行相关设置,主要是3步:1、克隆python环境;2、Pycharm选择python;3、导入ArcPy等。 详细内容可见: 公众号GISideas 1、克隆python环境 ArcGIS Pro自带的Python版本是无法被修改的,…

Elsevier——投稿系统遇到bug时的解决方法

重要&#xff1a;找期刊客服&#xff01;&#xff01;&#xff01; 一、方法&#xff1a; 1. 点击进入与官方客服的对话 2. 按要求输入个人信息 3. 输入遇到的问题 比如&#xff1a; 主题&#xff1a;The Current Status is jammed. 详细描述&#xff1a;The Current State o…

成功案例(IF=7.3)| 转录组+蛋白质组+代谢组联合分析分析揭示胰腺癌中TAM2相关的糖酵解和丙酮酸代谢重构

研究背景 肿瘤的进展和发展需要癌细胞的代谢重编程&#xff0c;癌细胞能量代谢模式的改变可以满足快速增殖和适应肿瘤微环境的需要。肿瘤微环境&#xff08;TME&#xff09;中的代谢状态受到多种因素的影响&#xff0c;包括血管生成、与其他细胞的相互作用和系统代谢。代谢异质…

CV每日论文--2024.5.6

1、Multi-Space Alignments Towards Universal LiDAR Segmentation 中文标题&#xff1a;多空间对齐向通用激光雷达分割推进 简介&#xff1a;这篇论文提出了一种名为M3Net的框架,旨在实现通用的激光雷达数据分割。这个框架能够在多任务、多数据集和多模态的激光雷达数据上进行…

DDR5内存新标准问世,体验前所未有的数据传输速度

DDR 5&#xff0c;新标准发布 JEDEC 发布了 JESD79-5C DDR5 SDRAM 标准&#xff0c;带来了关键更新&#xff0c;包括&#xff1a;* 增强可靠性和安全性* 优化高性能服务器和新兴技术&#xff08;如 AI 和机器学习&#xff09;的性能* 标准可从 JEDEC 网站下载 JESD79-5C 引入每…

Web前端一套全部清晰 ⑥ day4 CSS.2 复合选择器、CSS特性、背景属性、标签的显示模式

别人的议论&#xff0c;那是别人的&#xff0c;你的人生&#xff0c;才是你的 —— 24.5.7 一、复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09; 1.后代选择…

Leetcode—933. 最近的请求次数【简单】

2024每日刷题&#xff08;128&#xff09; Leetcode—933. 最近的请求次数 实现代码 class RecentCounter { public:RecentCounter() {}int ping(int t) {q.push(t);while(t - 3000 > q.front()) {q.pop();}return q.size();} private:queue<int> q; };/*** Your Re…

Amazon Bedrock 托管 Llama 3 8B70B

Amazon Bedrock 托管 Llama 3 8B&70B&#xff0c;先来体验&#xff1a;&#xff08;*实验环境账号有效期为1天&#xff0c;到期自动关停&#xff0c;请注意重要数据保护&#xff09; https://dev.amazoncloud.cn/experience/cloudlab?id65fd86c7ca2a0d291be26068&visi…

装饰器模式-原理分析以及动手练习

目录 应用场景涉及的角色和类&#xff08;个人理解&#xff09;涉及的角色组件&#xff08;标准&#xff09;基本实现 Demo&#xff08;可以直接 copy 跑一下看效果&#xff09;自己动手实战需求参考答案 相关话题参考文章 应用场景 需要给一个现有类添加附加功能&#xff0c;…