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异常处理异常处理…

autosar引入了Secure SOME/IP-ACL 有什么目的?如何实现的?

Secure SOME/IP-ACL 是一种基于 AUTOSAR 的安全机制&#xff0c;用于保护车载以太网上的 SOME/IP 通信。它的目的是防止未经授权的客户端或服务端访问或提供敏感的服务。 Secure SOME/IP-ACL 的实现主要依赖于两个模块&#xff1a; Secure Onboard Communication (SecOC) Sec…

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

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

Linux 服务器查看每个用户或者当前用户的磁盘占用量及文件同步

1、查看每个用户的磁盘占用量 #参考du -sh 目录 sudo du -sh /home/*1、两台服务器文件夹同步 rsync -avz -e "ssh -p 端口号" /home/cb215/ 用户名ip地址:/home/dell/16000_port/yf215/参考文献 [1]ubuntu查看每个用户或者当前用户的磁盘占用量及磁盘空间清理

java.lang.UnsupportedOperationException

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

AUTOSAR从入门到精通-面向服务的中间件SOME/IP(六)

目录 前言 原理 SOME/IP 协议服务接口 SOME/IP-SD协议文档 1.概述 1

LeetCode260. Single Number III

文章目录 一、题目二、题解 一、题目 Given an integer array nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once. You can return the answer in any order. You must …

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

简介&#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

Java8 IfPresent 与 forEach 的组合操作

一、需求背景 Java8的Optional接口是我们经常使用的一个接口&#xff0c;尤其是对对象进行判空的时候&#xff0c;需要经常使用到IfPresent()。 但是&#xff0c;如果是对List进行判空、循环的话&#xff0c;就稍显繁杂了&#xff0c;因为几乎每次对List进行操作的时候&a…

AI视频-stable-video-diffusio介绍

介绍 stbilityai/stable-video-diffusion-img2vid-xt模型&#xff0c;由Stability AI开发和训练的基于散度的图像到视频生成模型。该模型可以接受一张静态图像作为条件,并生成出一个短视频。 该模型通过在SVD Image-to-Video [14帧]的基础上进行微调而来,可以生成576x1024分辨…

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

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

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

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

Windows 10/11 免费安装HEVC/H.265视频扩展

将系统从 Win 10 升级到 Win 11 后&#xff0c;用系统自带播放器打开 HEVC &#xff08;H.265编码&#xff09;格式视频时&#xff0c;提示缺少编码器无法播放&#xff1b;以前可以通过浏览器访问 ms-windows-store://pdp/?ProductId9n4wgh0z6vhq 跳转到微软应用店免费安装解…

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

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

docker镜像与容器的迁移

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