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等)则可。【需注意坐标点的转换】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter-Statewidget 创建State过程State<XXXX> createState() => _XXXXState()的解释

文章目录 创建widget 的状态对象示例代码解析 完整的代码示例总结 创建widget 的状态对象 今天有个同学问了我下State createState() > _XXXXState()时什么意思。这个代码在flutter开发中一直看到&#xff0c;很多人都不关心这个&#xff0c;直接当模板使用。今天来介绍下这…

Python中tkinter编程入门3

在使用tkinter创建了窗口之后&#xff0c;可以将一些控件“放置”到窗口中。这些控件包括标签、按键以及输入框等。 1 在窗口中“放置”标签 在窗口中“放置”标签主要有两个步骤&#xff0c;一是创建标签控件&#xff0c;二是将创建好的标签“放置”到窗口上。 1.1 创建标签…

Maven- Profile详解

前言 Profile能让你为一个特殊的环境自定义一个特殊的构建&#xff1b;profile使得不同环境间构建的可移植性成为可能。 <project><profiles><profile><build><defaultGoal>...</defaultGoal><finalName>...</finalName><…

通过自建镜像方式搭建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…

WAAP全站防护理念,发现和保护敏感数据

数据是现代企业的新石油&#xff1a;正确使用它可以促进公司的发展并帮助企业在竞争中领先。就像石油一样&#xff0c;原始数据和未被发现的数据是毫无用处的&#xff0c;企业将无法从中受益&#xff1b;在最坏的情况下&#xff0c;它可能会导致安全事件。这也是企业投资敏感数…

Python | Leetcode Python题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution:def sortColors(self, nums: List[int]) -> None:n len(nums)p0, p2 0, n - 1i 0while i < p2:while i < p2 and nums[i] 2:nums[i], nums[p2] nums[p2], nums[i]p2 - 1if nums[i] 0:nums[i], nums[p0] num…

R语言数据探索与分析-碳排放分析预测

# 安装和加载需要的包 install.packages("readxl") install.packages("forecast") install.packages("ggplot2") library(readxl) library(forecast) library(ggplot2)# 数据加载和预处理 data <- read_excel("全年数据.xlsx") co…

全新神经网络架构KAN——本文用于学习与探索

论文地址&#xff1a;https://arxiv.org/pdf/2404.19756 Github&#xff1a;GitHub - KindXiaoming/pykan: Kolmogorov Arnold Networks 文档说明&#xff1a;Welcome to Kolmogorov Arnold Network (KAN) documentation! — Kolmogorov Arnold Network documentation 本文仅…

A计算机上的程序与B计算机上部署的vmware上的虚拟机的程序通讯 如何配置?

环境&#xff1a; 在A计算机上运行着Debian11.3 Linux操作系统&#xff1b;在B计算机上运行着Windows10操作系统&#xff0c;并且安装了VMware软件&#xff0c;然后在VMware上创建了虚拟机C并安装了CentOS 6操作系统 需求&#xff1a; 现在A计算机上的程序需要同虚拟机C上的软…

【RAG 论文】Contriever:对比学习来无监督训练文本嵌入模型

论文&#xff1a;Unsupervised Dense Information Retrieval with Contrastive Learning ⭐⭐⭐⭐⭐ Facebook Research, arXiv:2112.09118 Code&#xff1a;github.com/facebookresearch/contriever 一、论文速读 本文使用对比学习的方法来对文本检索模型做无监督学习训练&am…

MySQL-索引篇

文章目录 什么是索引&#xff1f;索引的优缺点索引底层数据结构选型Hash表二叉查找树AVL树红黑树B树&B树 索引类型总结主键索引二级索引聚集索引与非聚集索引聚集索引非聚集索引 覆盖索引与关联索引覆盖索引联合查询最左前缀匹配原则 索引下推如何正确使用索引选择合适的字…

信息检索(35):LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL

LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL 标题摘要1 引言2 相关工作3 LEXMAE&#xff1a;词典瓶颈屏蔽自动编码器3.1 语言建模编码器3.2 词典瓶颈模块3.3 弱化掩蔽式解码器3.4 词汇加权检索器的预训练目标和微调 4 实验4.1 主要评估4.2 效率分析与…

「云渲染教程」3D渲染时GPU内存不足怎么解决?

在进行三维场景渲染时&#xff0c;如果遇到模型较为复杂&#xff0c;用户们可能会面临图形处理单元&#xff08;GPU&#xff09;内存不足的挑战。这种情况通常意味着现有的硬件配置不足以满足渲染任务的需求。为了缓解GPU的工作压力&#xff0c;可以采取一些策略来优化资源的分…

如何使用联合体判断一个机器是大端还是小端

如何使用联合体判断一个机器是大端还是小端 #include<iostream> using namespace std; union Checker//联合体中的数据共享内存 {int val;char ch[2]; }; int main() {Checker checker;checker.val 0x1234;if (checker.ch[0] 0x34)//数组中的数据是由低地址往高地址存放…

Arduino-ILI9341驱动开发TFT屏显示任意内容三

Arduino-ILI9341驱动开发TFT屏显示任意内容三 1.概述 这篇文章介绍使用ILI9341驱动提供的函数控制TFT屏显示字符串、图形、符号等等内容的编辑和展示。 2.硬件 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻…

什么是web3D?应用场景有哪些?如何实现web3D展示?

Web3D是一种将3D技术与网络技术完美结合的全新领域&#xff0c;它可以实现将数字化的3D模型直接在网络浏览器上运行&#xff0c;从而实现在线交互式的浏览和操作。 Web3D通过将多媒体技术、3D技术、信息网络技术、计算机技术等多种技术融合在一起&#xff0c;实现了它在网络上…

QT6 android程序界面强制横屏显示不旋转

QT6开发的Android程序有时候旋转后程序会变形&#xff0c;比如想让其固定位横屏显示&#xff0c;就需要进行特殊设置&#xff0c;本文提供一种简便的设置方法。 一.AndroidManifest.xml文件介绍 Android的Manifest.xml文件是一个重要的配置文件&#xff0c;用于描述应用程序的…

2024.5.9 关于 SpringCloud —— Nacos 的安装与配置

目录 Windos 安装步骤 docker 启动 nacos Windos 安装步骤 1&#xff09;点击下方链接&#xff0c;进入并访问 nacos 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 2&#xff09;按照下图箭头指示下载对应版本的压缩包 3&#xff09;此时我们将得到一个压缩包&…

ARM时钟树结构(GD32)

时钟树的简易框图 初始化配置系统时钟 配置系统初始化时钟&#xff08;参考手册&#xff09; 对应hal库函数 使用72MHz的系统时钟 do -----------while&#xff08;0&#xff09;的使用方法 系统时钟 #include <stdint.h> #include "gd32f30x.h"int main(void)…

分布式事务技术方案

什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现…