QT----第三天,Visio stdio自定义封装控件,鼠标事件,定时器,事件分发器过滤器,绘图事件

目录

  • 第三天
    • 1 自定义控件封装
    • 2 QT鼠标事件
    • 3 定时器
    • 4 event事件分发器
    • 5 事件过滤器
    • 6 绘图事件Qpainter

源码:CPP学习代码

第三天

1 自定义控件封装

新建一个QT widgetclass,同时生成ui,h,cpp文件

在这里插入图片描述
在smallWidget.ui里添加上你想要的控件并调试大小

在这里插入图片描述
回到mainwidget.ui,拖入一个widget(因为我们封装的也是widget),右击提升为,输入名字(名字一定要写对)。

在这里插入图片描述

此时还需要进入mainWidget.h,按住ALT进入"ui_mainWidget.h",修改smallWidget的<>为引号“”(“”是本地的头文件),这时候运行就能看到我们的控件了。

在这里插入图片描述

在smallwidget.cpp里编写代码,让这两个控件QspinxBox和QSilder联系起来,查找手册里的信号和槽,没有就查找父类

//QspinxBox移动,QSlider跟着移动 查手册,没有就查父类
connect(ui.spinBox,&QSpinBox::valueChanged,ui.horizontalSlider,&QSlider::setValue);
//QSilder移动,QspinxBox跟着移动
connect(ui.horizontalSlider, &QSlider::sliderMoved,ui.spinBox, &QSpinBox::setValue);

再添加两个按钮,一个显示值,一个让值变成一半

在smallwidget头文件里定义两个函数,并到cpp里实现

//设置值
void setNumber(int value);
//得到值
int getNumber();void smallWidget::setNumber(int value)
{//设置值ui.spinBox->setValue(value);
}int smallWidget::getNumber()
{//返回值return ui.spinBox->value();
}

再到mainwidget.cpp里实现信号的连接,由于smallwi是连接到mainwi里边的widget,所以可以通过ui来访问widget来得到我们定义的函数

//点击获取值
connect(ui.btn1,&QPushButton::clicked,[=](){qDebug()<< ui.widget->getNumber();
});
//点击设置值
connect(ui.btn2, &QPushButton::clicked, [=]() {ui.widget->setNumber(50);qDebug() << ui.widget->getNumber();
});

在这里插入图片描述

2 QT鼠标事件

Enterevent,鼠标进入这个控件就会被捕捉。

不想用ui,只想用自定义事件来捕捉鼠标,就新建一个QTclass,只要h和cpp。查询手册鼠标进入和鼠标退出的函数,直接复制。

//鼠标进入
void enterEvent(QEnterEvent* event);//鼠标离开
void leaveEvent(QEvent* event);void mylabel::enterEvent(QEnterEvent * event)
{qDebug() <<"鼠标进入了";
}void mylabel::leaveEvent(QEvent* event)
{qDebug() << "鼠标离开了";
}

在ui中拖入label,因为我们使用的Qlabel,所以这个mylabel.h和cpp应该继承QLabel,更改以下三处

在这里插入图片描述

然后跟上边一样将这个更主界面连接起来,ui界面右键提升为,输入名字,然后修改ui_mainWidget.h里边将mylabely的引用改为“”。此时运行就会发现能够捕捉到鼠标

在这里插入图片描述

在查询手册,QLabel还有很多对鼠标的操作,我们直接复制来实现,可以在点击时实现输出,移动时输出需要更改因为移动是一个过程。Qstring格式化输出Qstring(%1 %2).arg(参数1).arg(参数2)

在这里插入图片描述

void mylabel::mousePressEvent(QMouseEvent* ev)
{//QT6很多都删了但是还能使用,不推荐if(ev->button() == Qt::LeftButton){QString str = QString("鼠标按下 x =%1  y =%2 globalx=%3 ").arg(ev->pos().x()).arg(ev->pos().y()).arg(ev->globalPosition().toPoint().x());qDebug() << str;}
}void mylabel::mouseReleaseEvent(QMouseEvent* ev)
{if (ev->button() == Qt::LeftButton){qDebug() << "鼠标释放";}
}void mylabel::mouseMoveEvent(QMouseEvent* ev)
{//因为移动是个过程,所以直接==不能够触发,这边用的是buttons,里边包含了三种状态,使用与操作符,当状态和Leftbutton相同时触发if (ev->button() & Qt::LeftButton){ qDebug() << "鼠标移动111";}
}

在构造函数里添加上鼠标追踪,就不用判断是否点击或者移动来打印信息,会实时打印

mylabel::mylabel(QWidget*parent): QLabel(parent)
{//设置鼠标追踪,默认falsesetMouseTracking(true);
}

3 定时器

使用时间间隔来做出动作,可以让数加一。首先得在头文件里重写定时器事件timerEvent,可以定义定时器的id,startimer启动定时器,让不同的控件有不同的时间间隔,通过timerId()来指定对应的计时器。第二种方式,直接使用QTimer新建一个对象,使用timeout信号连接即可。

//.h
//重写定时器事件
void timerEvent(QTimerEvent *event);int id1;//定时器的id
int id2;//定时器的id//.cpp
#include <QTimer>
mainWidget::mainWidget(QWidget *parent): QWidget(parent)
{ui.setupUi(this);//启动定时器id1 = startTimer(1000);//单位毫秒,每隔一秒调用函数id2 = startTimer(2000);//单位毫秒,每隔2秒调用函数//定时器的第二种方式QTimer* timer = new QTimer(this);//启动定时器timer->start(500);connect(timer,&QTimer::timeout,[=](){static int num2 = 1;ui.label3->setText(QString::number(num2++));});//点击按钮暂停connect(ui.btn1,&QPushButton::clicked,\[=\](){timer->stop();});
}mainWidget::~mainWidget()
{}void mainWidget::timerEvent(QTimerEvent * event)
{if (event->timerId() == id1){static int num = 1;ui.label2->setText(QString::number(num++));}//   //两秒跳一次//if (event->timerId() == id2)//{//        static int num2 = 1;//        ui.label3->setText(QString::number(num2++));//}}

4 event事件分发器

每个发出的响应都会经过这个事件分发器,如果返回true就直接截胡了,相当于你点击鼠标是不触发鼠标点击而触发你定义的事件
在这里插入图片描述

type里边有很多的事件
在这里插入图片描述

如果返回值是true代表用户需要拦截处理这个事件不向下分发

//.h
//通过Event事件分发器拦截鼠标按下事件
bool event(QEvent *e);//.cpp
bool mylabel::event(QEvent* e)
{//如果是鼠标按下,在event事件分发中做拦截操作if (e->type() == QEvent::MouseButtonPress){//类型转换,e是ev的父类QMouseEvent* ev = static_cast<QMouseEvent*>(e);QString str = QString("鼠标按下222 x =%1  y =%2 globalx=%3 ").arg(ev->pos().x()).arg(ev->pos().y()).arg(ev->globalPosition().toPoint().x());qDebug() << str;return true;//代表用户自己处理这个事件}//其他事件交给父类处理,默认处理return QLabel::event(e);
}

5 事件过滤器

相当于拦截了事件分发器。使用过程两个步骤,1、给控件安装事件过滤器,2、重写eventfilter事件

在这里插入图片描述

//.h//在widget中重写eventfilter事件bool eventFilter(QObject *watched, QEvent *event);//.cpp
//给label1安装事件过滤器
//1、构造函数里安装事件过滤器
ui.label1->installEventFilter(this);//2、重写事件,obj就是控件
bool mainWidget::eventFilter(QObject* watched, QEvent* event)
{if (watched == ui.label1){if (event->type() == QEvent::MouseButtonPress){//类型转换,e是ev的父类QMouseEvent* ev = static_cast<QMouseEvent*>(event);QString str = QString("事件过滤器鼠标按下 x =%1  y =%2 globalx=%3 ").arg(ev->pos().x()).arg(ev->pos().y()).arg(ev->globalPosition().toPoint().x());qDebug() << str;}}//默认交给父类处理return QWidget::eventFilter(watched,event);
}

6 绘图事件Qpainter

整体比较简单。只需要重写panitEvent事件,并且声明画家对象,笔刷画笔也只需要先声明对象。

//.h
//绘图事件
void paintEvent(QPaintEvent *);//.cpp
void mainWidget::paintEvent(QPaintEvent*)
{//实例化画家对象,this指定的是绘图设备QPainter painter(this);//设置画笔QPen pen(QColor(255,0,0));pen.setWidth(3);//宽度pen.setStyle(Qt::DotLine);//风格//使用画笔,红色painter.setPen(pen);//画刷,会填充封闭的图形QBrush brush(QColor(0,255,0));painter.setBrush(brush);//画线painter.drawLine(QPoint(0,0),QPoint(100,100));//画圆painter.drawEllipse(QPoint(100,100),50,50);//画矩形painter.drawRect(50,50,50,50);//画文字painter.drawText(QRect(10,200,150,50),"学习");
}

在这里插入图片描述

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

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

相关文章

ISSUE的基本概念

ISSUE:将符合一定条件的指令从发射队列&#xff08;IssueQueue)中选出来&#xff0c;并送到FU中执行的过程; ISSUE QUEUE也称之为reservation station, 其按照一定的规则&#xff0c;选择那些源操作数都已经准备好的指令&#xff0c;将其送到FU中执行&#xff0c;这个过程称为…

11.jvm第三方工具使用实践

目录 概述GCEasy官网jvm内存占用情况关键性能指标堆内存与元空间优化 MAT安装MAT相关概念说明内存泄漏与内存溢出shallow heap及retained heapoutgoing references与incoming referencesDominator Tree GCViewerArthas下载安装与启动jdk8jdk 11jdk11自定义boot jarjdk17 常用命…

LVS负载均衡集群和NAT模式部署

目录 一、群集的类型及含义 二、LVS的三种工作模式 一、根据群集所针对的目标差异&#xff0c;可分为三种类型 二、LVS的负载调度算法 三、ipvsadm 工具选项 四、NAT模式 LVS负载均衡群集部署 1.共享服务器配置&#xff1a; 2.节点服务器1配置 3.节点服务器2 4.配置负…

spring 笔记八 SpringMVC异常处理和SpringMVC拦截器

文章目录 SpringMVC拦截器拦截器&#xff08;interceptor&#xff09;的作用拦截器和过滤器区别拦截器是快速入门拦截器方法说明 SpringMVC拦截器拦截器&#xff08;interceptor&#xff09;的作用拦截器和过滤器区别拦截器是快速入门拦截器方法说明 SpringMVC异常处理异常处理…

网络服务IP属地发生变化的原因有哪些?

近期&#xff0c;许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的&#xff0c;而是发生了变动。这一现象引起了广大用户的关注和疑惑&#xff0c;对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑&#xff0c;我们对此现象进行了深入探究…

java.lang.UnsupportedOperationException

一、背景 记录一次小坑… 最近在写一个关于Excel导出的小需求&#xff0c;由于系统都有一些工具类&#xff0c;还有原来已经做好的导出&#xff0c;直接拿过来改了改就用了&#xff0c;没想到直接报错&#xff0c;尴尬。 还是那句话&#xff0c;别人都能用&#xff0c;我复制…

国产浪潮服务器:风扇免手动调节脚本

简介&#xff1a;浪潮集团&#xff0c;是中国本土顶尖的大型IT企业之一&#xff0c;中国领先的云计算、大数据服务商。浪潮集团旗下拥有浪潮信息、浪潮软件、浪潮国际&#xff0c;业务涵盖云计算、大数据、工业互联网等新一代信息技术产业领域&#xff0c;为全球120多个国家和地…

【人工智能】模糊推理

模糊推理:交叉的隶属函数&#xff0c;方法如模糊规则中推理方法一致&#xff0c;step3中的每一个格子都有所应的隶属关系函数 引言&#xff1a;“生活中的模糊关系”模糊集合模糊集合的定义模糊集合的表示法模糊集合表示法示例 隶属函数 模糊规则模糊计算的流程 引言&#xff1…

RT-DETR 目标过线计数

使用 Ultralytics RT-DETR 进行目标计数 🚀 实际应用场景 物流水产养殖使用 Ultralytics RT-DETR 进行传送带包裹计数使用 Ultralytics RT-DETR 在海中进行鱼类计数请使用最新代码(2023年12月8日后),旧版本不支持! 示例 “目标计数示例” 目标计数 from ultralytics

初识Redis缓存,一文掌握Redis重要知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

存储拆分后,如何解决唯一主键问题?

之前我们讲到了分库分表&#xff0c;现在考虑这样一个问题&#xff1a;在单库单表时&#xff0c;业务 ID 可以依赖数据库的自增主键实现&#xff0c;现在我们把存储拆分到了多处&#xff0c;如果还是用数据库的自增主键&#xff0c;势必会导致主键重复。 那么我们应该如何解决…

【算法】【动规】乘积为正数的最长子数组长度

跳转汇总链接 &#x1f449;&#x1f517;算法题汇总链接 1.1 乘积为正数的最长子数组长度 &#x1f517;题目链接 给你一个整数数组 nums &#xff0c;请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积…

docker镜像与容器的迁移

docker容器迁移有两组命令&#xff0c;分别是 save & load &#xff1a;操作的是images&#xff0c; 所以要先把容器commit成镜像export & import&#xff1a;直接操作容器 我们先主要看看他们的区别&#xff1a; 一 把容器打包为镜像再迁移到其他服务器 如把mysq…

RMQ算法总结

知识概览 RMQ又叫ST表、跳表&#xff0c;可以用来解决区间最值问题&#xff0c;这里这有查询没有修改。当然&#xff0c;这样的问题用线段树也是可以解决的。RMQ算法本质上是倍增动态规划&#xff0c;它的思想是先倍增预处理再查询。f(i, j)表示从i开始&#xff0c;长度是的区…

【Jeecg Boot 3 - 第二天】2.1、nginx 部署 JEECGBOOT VUE3

一、场景 二、实战 ▶ 2.1、打包&#xff08;build 前端&#xff09; &#xff1e; Stage 1&#xff1a;修改配置文件 .env.production&#xff08;作用&#xff1a;指向后端接口地址&#xff09; &#xff1e; Stage 2&#xff1a;点击build&#xff08;作用&#xff1…

虚幻学习笔记13—C++静态和动态加载

一、前言 我们在蓝图中可以很方便的添加各种需要的组件&#xff0c;那么在C代码中要如何实现呢。在代码中分静态和动态加载&#xff0c;而无论静态和动态&#xff0c;加载的内容有资源和资源类&#xff0c;资源类通常为带资源的蓝图类。 二、实现 在实现静态或动态加载时&…

生成式AI的力量,释放RPA的无限潜能

回首即将过去的2023年&#xff0c;互联网行业似乎始终处在各种新概念的热潮激荡之中。其中&#xff0c;最引人注目的话题无疑是AI科技。自人工智能技术实现大规模突破以来&#xff0c;我们见证了一系列生成式AI的涌现。从ChatGPT到百度文心一言&#xff0c;它们纷纷登场&#x…

Cellinx NVT 摄像机 GetFileContent.cgi任意文件读取漏洞 (CVE-2023-23063)

0x01 产品简介 Cellinx NVT IP PTZ是韩国Cellinx公司的一个摄像机设备。 0x02 漏洞概述 Cellinx NVT v1.0.6.002b版本存在安全漏洞&#xff0c;该漏洞源于存在本地文件泄露漏洞&#xff0c;攻击者可读取系统密码等敏感信息。 0x03 复现环境 FOFA&#xff1a;body"loc…

云仓酒庄带您品法国葡萄酒

说起葡萄酒肯定绕不开法国&#xff0c;法国葡萄酒闻名中外&#xff0c;口碑卓越。作为世界上的产酒大国&#xff0c;可以说是每一寸土地都可以种植葡萄。云仓酒庄的品牌雷盛红酒分享这么优秀的一个葡萄酒产酒国有哪些特点呢&#xff1f; 1.产区特色&#xff1a;波国有最著名的…

vue3 使用antd 报错Uncaught TypeError--【已解决】

问题现象 使用最基本的 ant-design-vue 按钮demo 都报错 报错文字如下 Uncaught TypeError: Cannot read properties of undefined (reading value)at ReactiveEffect.fn (ant-design-vue.js?v597f5366:6693:87)at ReactiveEffect.run (chunk-K2VKR2AM.js?v25c381c3:461:…