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.hqwc.cn/news/689297.html

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

相关文章

静态IP地址怎么维护网络稳定?

在数字化日益深入的今天&#xff0c;网络已经成为我们生活、工作和学习中不可或缺的一部分。而在网络世界中&#xff0c;IP地址扮演着至关重要的角色。其中&#xff0c;静态IP地址以其独特的稳定性和安全性&#xff0c;成为了众多企业和个人用户的首选。 一、静态IP地址的基本概…

通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群 1. 应用准备1.1 应用目录结构1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 编写DockerFile2.1 将所有本地文件拷贝到工作目录2.2 拷贝文件到源目录&增加执行权限2.3 安装Erlang & rab…

后端常用技能:基于easy-poi实现excel一对多、多对多导入导出【附带源码】

0. 引言 在业务系统开发中&#xff0c;我们经常遇到excel导入导出的业务场景&#xff0c;普通的excel导入导出我们可以利用 apache poi、jxl以及阿里开源的easyexcel来实现&#xff0c;特别easyexcel更是将excel的导入导出极大简化&#xff0c;但是对于一些负载的表格形式&…

设计模式2——原则篇:依赖倒转原则、单一职责原则、合成|聚合复用原则、开放-封闭原则、迪米特法则、里氏代换原则

设计模式2——设计原则篇 目录 一、依赖倒转原则 二、单一职责原则&#xff08;SRP&#xff09; 三、合成|聚合复用原则&#xff08;CARP&#xff09; 四、开放-封闭原则 五、迪米特法则&#xff08;LoD&#xff09; 六、里氏代换原则 七、接口隔离原则 八、总结 一、依赖…

力扣70 爬楼梯 C语言 动态规划 递归

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…

通义灵码企业版正式发布,满足企业私域知识检索、数据合规、统一管理等需求

5 月 9 日阿里云 AI 峰会&#xff0c;阿里云智能集团首席技术官周靖人宣布&#xff0c;通义灵码企业版正式发布&#xff0c;满足企业用户的定制化需求&#xff0c;帮助企业提升研发效率。 通义灵码是国内用户规模第一的智能编码助手&#xff0c;基于 SOTA 水准的通义千问代码模…

QT day5 作业

服务器头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QList> //链表类 #include <QMessageBox> //消息对话框类 #include <QDebu…

论文阅读_RAG融合现有知识树_T-RAG

英文名称: T-RAG: LESSONS FROM THE LLM TRENCHES 中文名称: T-RAG&#xff1a;来自LLM战壕的经验教训 链接: https://arxiv.org/abs/2402.07483 作者: Masoomali Fatehkia, Ji Kim Lucas, Sanjay Chawla 机构: 卡塔尔计算研究所, 哈马德本哈利法大学 日期: 2024-02-12 引用次数…

零基础HTML教程(32)--HTML5语义化标签

文章目录 1. div时代2. div的缺点3. 语义化标签4. 语义化标签有哪些5. 实战演练6. 小结 1. div时代 我是2009年开始学习网页开发的&#xff0c;那时候HTML里面到处是div。 这么说吧&#xff0c;那时候div就是网页的骨架&#xff0c;支撑着网页的主结构。 2. div的缺点 div作…

conan2 基础入门(02)-安装

conan2 基础入门(02)-安装 文章目录 conan2 基础入门(02)-安装⭐前言⭐安装python安装安装包安装自行操作 ⭐验证配置环境变量命令行验证conan配置文件 END ⭐前言 Conan 2.0: C and C Open Source Package Manager 官方提供三种安装conan的方式。分别为&#xff1a; Recommen…

Raspberry Pi Connect 官方树莓派远程连接新方式

系列文章目录 前言 2024 年 5 月 7 日 戈登-霍林沃思 今天&#xff0c;我们很高兴地宣布 Raspberry Pi Connect 测试版发布&#xff1a;这是一种安全、易用的方法&#xff0c;只需使用网络浏览器&#xff0c;就能从地球上的任何地方远程访问您的 Raspberry Pi。 远程访问 Rasp…

数据结构----二叉树

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1. 树型结构 1.1 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上…