QT7_视频知识点笔记_3_自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口

第三天:

自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口实现
1.自定义控件:
创建新的QT控件类,然后再需要使用的地方--》提升为   来使用

如何使用基础控件的信号和槽函数(),一个改变另外一个也跟着进行改变(重点:已知类帮助文档查找信号和槽或函数)

//使用信号槽来完成功能//调节数字控件,则横向的数值会跟着变动//QSpinBox::valueChanged有函数重载,需要使用指针的形式void (QSpinBox::*SigValueChange) (int) = &QSpinBox::valueChanged;connect(ui->spinBox,SigValueChange,ui->horizontalSlider,&QSlider::setValue);//调节横向数值,数字控件会跟着移动connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
2.事件处理器

以鼠标事件为例,键盘和其他事件类似
创建一个MyLabel类,继承自QLabel类,在其帮助文档的可重写函数中或者其基类中找需要的事件函数,然后进行重写。以鼠标进入,鼠标离开,鼠标按下,定时器(其本质是回调函数,不用我们自己调用,只需要重写,条件满足会自动调用)

public:explicit MyLabel(QWidget *parent = 0);//继承自一个窗口类protected://是受保护的成员变量(在QLabel的基类QWidget中可以找到该函数)//鼠标进入void enterEvent(QEvent *);//鼠标离开void leaveEvent(QEvent *);//鼠标按下void mousePressEvent(QMouseEvent *event);//定时器void timeEvent(QTimerEvent *);
//要注意要加:QLabel(parent),要不然无法显示
MyLabel::MyLabel(QWidget *parent):QLabel(parent)
{this->setText("hello");
}
void MyLabel::enterEvent(QEvent *)
{setText("enterEvent");
}void MyLabel::leaveEvent(QEvent *)
{setText("leaveEvent");
}void MyLabel::mousePressEvent(QMouseEvent *ev)
{//从帮助文档中可查看QMouseEvent的使用if(ev->button() == Qt::LeftButton ){setText("mousePressEvent:Qt::LeftButton!");}
}
3.定时器:

方法a:重写定时器事件函数

//定时器
void timerEvent(QTimerEvent *);//每触发一次定时器,都进入该函数中
void MyLabel::timerEvent(QTimerEvent *)
{static int num = 0;QString str = QString("%1").arg(num++);setText(str);if(num == 100){killTimer(timeID);  //根据定时器开始时的返回ID去关闭定时器}}

启动定时器,此处启动在构造函数中

MyLabel::MyLabel(QWidget *parent):QLabel(parent)
{this->setText("hello");//启动定时器timeID = startTimer(100);//每隔100ms启动一次
}

方法b:添加QTimer类,创建对象,在计时到之后会发出信号,使用信号槽进行处理。(推荐这种写法)

//第二种定时器QTimer *timer1 = new QTimer(this);timer1->start(100);//100ms触发一次//timer1发出了信号,创建槽函数进行接收connect(timer1,&QTimer::timeout,this,[=](){static int number;this->setText(QString::number(number++));});
4.QPainter绘图和QPaintDevice(QPixMap,QBitmap,QImage,QPicture)绘图设备

a.需要绘图,先添加绘图类QPainter,然后需要重写虚函数

#include <QPainter>
.......
protected://1.虚函数(可重写)//2.回调函数(不需要用户去主动调用,在刷新窗口的时候会自动调用:窗口显示,最大化最小化,窗口被遮挡,重新显示时,用户强制刷新,...)//3.如果想使用画家类在窗口中画图,操作必须在paintEvent函数中完成void paintEvent(QPaintEvent *event) ;......
void Study_Painter::paintEvent(QPaintEvent *event)
{//绘图类重写虚函数绘图事件//创建画家类对象QPainter p(this);   //指定绘图设备--》在this当前窗口中画//根据提示(帮助文档写参数及其类型)//画背景图p.drawPixmap(0,0,QPixmap("D://321.jpg"));//画直线p.drawLine(QPoint(200,200),QPoint(300,300));}

显示结果:
在这里插入图片描述
创建画笔:(更改颜色等功能)-----轮廓

    QPen pen;pen.setColor(QColor(0,255,100));pen.setWidth(10);p.setPen(pen);	//将设置的pen传入给QPainter画家,然后再使用画家P进行画图操作p.drawPie(QRect(100,100,20,20),20,20);

创建画刷类:QBush(闭合区域可使用画刷),使用方式跟QPen类似(p.setBrush(…))
字体:QFont类,使用方式也类似,创建之后加入到画家类中(p.setFont(…))

paintEvent重载后,用户如何强制刷新界面(update(); )
void Study_CarManager::paintEvent(QPaintEvent *event)
{QPainter p(this);//添加x += 5;p.drawPixmap(x,100,QPixmap("D://myheart.png"));if(x > this->width()){//如果突破图片边界,则返回x = 20;}
}

在构造函数中,检测到按钮按下,则移动图片位置(强制刷新)

	x = 200;//注意在.h文件中和刷新//按下按钮刷新图片位置connect(ui->pushButton,&QPushButton::clicked,this,[=](){update();       //用户强制主动刷新,使用update会调用paintEvent});
5.QPaintDevice(QPixMap⭐,QBitmap,QImage,QPicture)绘图设备

主要使用QPixmap来显示图片,他针对于显示器显示做了特殊优化,依赖于平台,只能在主线程中使用(UI线程)
QImage,图片类,不依耐平台,可以在多线程中对其进行操作
使用方法:(绘图设备,画家类,画笔)

    //绘图设备画图,QImage是类似的QPixmap pix(300,300);   //纸张的大小pix.fill(Qt::red);QPainter p(&pix);   //创建画家类在绘图设备上作画//p.begin(&pix);	//如果之前有画家类则可使用begin函数更改绘图设备p.setPen(QPen(Qt::green));  //为画家类创建画笔提供使用p.drawRect(10,10,280,280);pix.save("D://mypixmap.png");

而QPicture只是保存的二进制文件,不是一个图片,保存的是绘图步骤,但是可根据QPicture的load函数传入一张之前保存的步骤图,然后drawPicture可正常绘图(可进行加密)。

6.绘制不规则窗口

怎样做一个不规则的窗口(边框去掉,背景设为透明,则只看见不透明的图片部分)

//在.h中
//1.把绘图设备设为全局可用
QPixmap pix;        //绘图设备
//2.重写绘图函数
protected:void paintEvent(QPaintEvent *event) ;//.cpp中
//1.在构造函数中加载所需图片
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//1.加载图片,需要背景是透明的pix.load("D://myheart.png");//2.去掉窗口边框this->setWindowFlags(Qt::FramelessWindowHint);    //窗口设置//3.设置背景透明this->setAttribute(Qt::WA_TranslucentBackground);
}//2.在paintEvent中使用画家类进行图片刷新
void Widget::paintEvent(QPaintEvent *event)
{//在窗口中把图片画出来QPainter p(this);p.drawPixmap(0,0,pix);  //把绘图设备导入画家类
}

效果:
在这里插入图片描述
如果需要跟随鼠标移动,或者鼠标右键关闭窗口,则在加入鼠标的事件处理器,重写对应的事件函数(例如:mousePressEvent,mouseMoveEvent等)则可。【需注意坐标点的转换】

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

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

相关文章

1.前端环境搭建

1.安装nodejs 因为我们开发Vue项目需要使用npm命令来创建和启动&#xff0c;安装node.js是为了获得这个命令&#xff0c;目前和使用node.js无关 下载地址&#xff1a;http://nodejs.cn/download/ 下载完之后安装&#xff0c;通过cmd查看是否安装成功 node --version2.创建项目…

探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别

&#xff08;1&#xff09;咱们可以用 decltype &#xff08;&#xff09; 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量&#xff0c;却行不通。测试如下&#xff1a; 如果把上面的注释去掉会报错&#xff1a; 所以函数类型只有语法意义。但在使用上没有函…

【C语言】/*操作符(下)*/

目录 一、操作符的分类 二、二进制和进制转换 2.1 进制 2.2 进制之间的转换 三、原码、反码、补码 四、单目操作符 五、逗号表达式 六、下标引用操作符[] 七、函数调用操作符() 八、结构体成员访问操作符 8.1 直接访问操作符(.) 8.2 间接访问操作符(->) 九、操作符…

修改el-checkbox样式

一定要在最外层&#xff1b; //未选中框/deep/ .el-checkbox__inner{border-color: #0862a3;}//选中框/deep/ .el-checkbox__input.is-checked .el-checkbox__inner{background-color: #0862a3;border-color: #0862a3;}//未选中框时右侧文字/deep/ .el-checkbox__label{}//选中…

git 推送github 选https遇到登录 openSSH问题

使用https需要使用github令牌token作为密码&#xff0c; 使用SSH不需要登录。 还有一个问题&#xff1a; 创建github仓库后没有quick setup页面解决办法 千万不要点击任何多的操作&#xff01;&#xff01;&#xff01;输入仓库名&#xff0c;直接create&#xff01;&#x…

return语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 return语句 一、return语句后面跟表达式二、return无返回三、return返回的值和函数返回类型不一致四、return语句执行后,后方仍然存在代码五、存在分支语句&#xff0c;需考虑…

去哪里找高清视频素材?推荐几个短视频素材免费网站

在数字时代&#xff0c;视频内容的质量直接影响观众的吸引力和留存率。尤其是高清、4K视频素材和可商用素材&#xff0c;它们在提升视觉质量和叙事深度方面起到了至关重要的作用。以下是一些国内外的顶级视频素材网站&#xff0c;它们提供的资源将为您的创作提供极大的支持和灵…

LeetCode/NowCoder-链表经典算法OJ练习1

目录 说在前面 题目一&#xff1a;移除链表元素 题目二&#xff1a;反转链表 题目三&#xff1a;合并两个有序链表 题目四&#xff1a;链表的中间节点 SUMUP结尾 说在前面 dear朋友们大家好&#xff01;&#x1f496;&#x1f496;&#x1f496;数据结构的学习离不开刷题…

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本&#xff1a; 机器人实体一般价格昂贵&#xff0c;为降低机器人学习、调试的成本&#xff1b;高效&#xff1a; 搭建的环境更为多样且灵活&#xff0c;可以提高测试效率以及测试覆盖率&#xff1b…

三大消息传递机制区别与联系

目录 总结放开头 1、定义区别&#xff1a; EventBus Broadcast Receiver Notification 2、使用区别: EventBus Broadcast Receiver Notification 3、补充通知渠道&#xff1a; 通知渠道重要程度 总结放开头 BroadCast Receiver:属于安卓全局监听机制&#xff0c;接收…

【算法】最短路问题 bfs 到 dijkstra

1976、到达目的地的方案数 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff0c;某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口&#xff0c;且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整…

五一 大项目--docker-compose编排lnmp完成wordpress

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

Linux-线程概念

1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&#xff0c;是OS调度的基本单位&#xff1b;进程内部线程共用同一个地址空间&#xff0c;同一个页表&#xff0c;以及内存中的代码和数据&#xff0c;这些资源对于线程来说都是共享的资源 进程&#xff1a;…

RabbitMQ (windows) 安装

大家好我是苏麟 , 今天安装一下 RabbitMQ . 官网 : RabbitMQ: One broker to queue them all | RabbitMQ 1.点击 Getting Started 2. 点击 Docs 3.点击 Install And Upgrade 4.点击 installation via Chocolatory 5. 直接下载安装包 RabbitMQ 下好了先放在一遍 RabbitMQ 需要 E…

【C++】-------反向迭代器的模拟实现(补充)

目录 前言 一、反向迭代器接口&#xff08;用户层&#xff09; 二、模拟实现 三、以vector模拟实现为例 四、总结 前言 在vector和list的接口中我们实际上有说明过反向迭代器的用法&#xff0c;这里就有个问题&#xff0c;并不是只有这两个容器存在反向迭代器的。那么对于他…

点云DBSCAN聚类,同时获取最多点数量的类,同时删除其他的类并显示

代码的主要目的是处理一个点云文件(从某个巷道或类似环境中获取的),并尝试识别并可视化其中的主要结构(比如墙壁),同时去除可能的噪声和异常点。它首先读取一个点云文件,进行降采样和异常点移除,然后使用DBSCAN聚类算法对剩余的点云进行聚类,最后选择并可视化包含最多…

应用案例 | 商业电气承包商借助Softing NetXpert XG2节省网络验证时间

一家提供全方位服务的电气承包商通过使用Softing NetXpert XG2顺利完成了此次工作任务——简化了故障排查的同时&#xff0c;还在很大程度上减少了不必要的售后回访。 对已经安装好的光纤或铜缆以太网网络进行认证测试可能会面临不同的挑战&#xff0c;这具体取决于网络的规模、…

示例五、气敏传感器

通过以下几个示例来具体展开学习,了解气敏传感器原理及特性&#xff0c;学习气敏传感器的应用&#xff1a; 示例五、气敏传感器 一、基本原理&#xff1a;随着人们生活水平的不断提高&#xff0c;人们对环境和健康问题越来越重视。各种燃气的广泛使用&#xff0c;使生产效率和…

多模态CLIP和BLIP

一、CLIP 全称为Contrastive Language-Image Pre-Training用于做图-文匹配&#xff0c;部署在预训练阶段&#xff0c;最终理解为图像分类器。 1.背景 以前进行分类模型时&#xff0c;存在类别固定和训练时要进行标注。因此面对这两个问题提出CLIP&#xff0c;通过这个预训练…

B 站评论系统架构设计难点

更多大厂面试内容可见 -> http://11come.cn B 站评论系统架构设计难点 这里整理一下在哔哩哔哩技术公众号看到的 B 站评论系统的架构设计文章&#xff0c;自己在学习过程中&#xff0c;对其中感觉比较有帮助的点做一下整理&#xff0c;方便以后查阅&#xff0c;详细版可以点…