一文带你入门 - Qt绘图QPainter

QPaintEvent绘图事件:

QPaintEvent 是 Qt 框架中一个重要的事件类,专门用于处理绘图事件。当 Qt 视图组件需要重绘自己的一部分时,就会产生 QPaintEvent 事件。这通常发生在以下几种情况:


1. 窗口第一次显示时:当窗口或控件第一次出现在屏幕上时,系统会生成一个 QPaintEvent 事件,
通知窗口进行自身的绘制。

2. 窗口大小改变时:当用户改变窗口的大小时,窗口的内容通常需要重新绘制以适应新的尺寸。

3. 窗口部分被遮挡后又重新显示时:如果窗口被其他窗口遮挡,然后又重新露出来,被遮挡的部分通常需要重新绘制

4. 手动请求重绘:通过调用 QWidget 的 update() 或 repaint() 方法,可以手动触发重绘事件。
在 Qt 应用程序中,通常通过重写 QWidget 的 paintEvent(QPaintEvent *) 方法来处理绘制逻辑。


根据上上内容,调用 update() repaint() 都能导致绘图事件的发生,鼠标指针进入/离开控件也会发生绘图事件

//设置定时器,每秒repaint()一次,发生一次绘图事件:

    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,[=](){
    //update();
    repaint();
    });
    timer->setInterval(1000);
    timer->start();


QPainter用法示例:


QPainter 是 Qt 库中用于在屏幕上进行绘画的类。它提供了各种绘制功能,比如画线、画图形、画文本等。
以下是一些基本的用法示例:


 初始化 QPainter:首先,您需要一个 QPaintDevice ,比如一个 QWidget 或 QPixmap ,然后使
用它来初始化 QPainter 对象。

QPainter painter(this); // 假设在 QWidget 的子类中

设置画笔和画刷:您可以设置画笔(用于描边)和画刷(用于填充)的颜色、样式等。


painter.setPen(Qt::blue); // 设置画笔颜色为蓝色
painter.setBrush(Qt::yellow); // 设置画刷颜色为黄色

绘制图形:使用 QPainter 的方法来绘制线条、矩形、圆形、文本等。


painter.drawLine(10, 10, 100, 100); // 画线
painter.drawRect(10, 10, 100, 100); // 画矩形
painter.drawText(10, 10, "Hello, Qt!"); // 画文本

结束绘制:完成绘制后, QPainter 对象会在其析构函数中自动结束绘制。
请注意, QPainter 的使用依赖于 Qt 的事件循环,因此通常在 QWidget 的 paintEvent 或者类似的事
件处理函数中使用它。如果您在 Qt 应用程序中使用 QPainter ,请确保您遵循 Qt 的事件驱动机制。


QPainter 画文字:

步骤:

1.实例化QPainter对象

2.设置绘图笔的属性

3.设置会出文字的字格式(体和大小)

4.开始绘制文字(可以指定绘制位置,绘制大小,对齐方式,绘制文字内容(中文/英文都可以))

绘制实例

//触发QPainterEvent事件调用这个函数 -> 一运行就会调用

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setPen(Qt::blue);painter.setFont(QFont("Arial", 20));painter.drawText(rect(), Qt::AlignCenter, "Qt中文也能画");
// rect 就是我们当前窗口qDebug()<<rect().width()<<','<<rect().height();//    void
//    drawStaticText(int left, int top, const QStaticText &staticText)
//    void
//    drawText(const QPointF &position, const QString &text)
//    void
//    drawText(const QPoint &position, const QString &text)
//    void
//    drawText(int x, int y, const QString &text)
//    void
//    drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)//参数说明: 从左到右//在 (50,100)位置绘制一个大小为(100,100)的文字,并居中显示,文字内容是"Qt"painter.drawText(50,100,100,100,Qt::AlignCenter, "Qt");//简单粗暴painter.drawText(20,30,"mxjun帅");}

效果演示

QPainter画线:

三种画线方式

1.纯通过两个点的坐标

2. 通过一个线对象

3.通过两个 点对象

//无论那种方式,都遵循-->  两点确定一条直线

    //QPainter 画线:painter.drawLine(10,200,300,20); // 绝对坐标绘制,给出起始点的坐标painter.drawLine(QLine(20,200,300,10)); //调用QLine 对象绘制 ->  构造方法也是给出两个点的坐标painter.drawLine(QPoint(30,200),QPoint(300,40));//调用QPiont -> 构造方式是一个点的坐标, 两个QPoint对象构成一条线即可

效果演示


     QPainter 画矩形:


两种方式画矩形

//参数依次是:  起点坐标x,起点坐标y,矩形宽度,矩形高度
    //    drawRect(int x, int y, int width, int height)//起点坐标x,起点坐标y,矩形宽度,矩形高度painter.drawRect(400,200,200,100);//    drawRect(const QRectF &rectangle)//构造QRectF 对象 传入四个参数,依次是:起点坐标x,起点坐标y,矩形宽度,矩形高度QRectF rectangle(200,100,200,100);painter.drawRect(rectangle);

效果演示
 


 QPainter画 椭圆:


 

四种方式画椭圆:

遵循原则: 前面参数指定圆心位置,后面参数指定椭圆的宽度和高度

//除了内切矩形

      painter.drawEllipse(rectangle); //内切与我们画的矩形painter.drawEllipse(100,100,100,50); // 参数: 前两个指定圆心位置,后两个参数椭圆的宽度,高度painter.drawEllipse(rect().center(),200,100);//在当前矩形的中心点为原型,指定宽度200,高度100painter.drawEllipse(QPoint(120,120),50,50);

效果演示

QPainter画弧形:
 

两种方式画弧形

参数形式: 矩形描述(矩形对象 / 4个参数表示恶毒矩形),起始角,伸缩角
       //画 弧形://前面的参数: 弧度中心位置(可以矩形和圆心坐标表示),起始角,伸缩角painter.drawArc(rectangle,-30*16,-120*16); // 第一种。前面参数用矩形对象表示painter.drawArc(50,100,100,200,45*16,90*16); //前面用四个参数描绘出一个矩形(起点x,y,宽度,高度)

效果演示

QPainter画扇形:

设置画笔样式

    QPainter painter(this);
    QPen pen(Qt::red,5); // 设置画笔颜色 和 宽度
    painter.setRenderHint(QPainter::Antialiasing,true); // 设置抗锯齿,让边缘显得更加光滑
    painter.setPen(pen);

两种方式画扇形

//实现方法和弧形一样

参数形式: 矩形描述(矩形对象 / 4个参数表示恶毒矩形),起始角,伸缩角


       painter.drawPie(rectangle,-30*16,-120*16); // 第一种。前面参数用矩形对象表示
       painter.drawPie(50,100,100,200,45*16,90*16); //前面用四个参数描绘出一个矩形(起点x,y,宽度,高度)

效果演示

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

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

相关文章

计算机组成原理(二)

ACC&#xff08;累加器&#xff09;&#xff1a; 用于存储高位部分 MQ&#xff08;乘数-商寄存器&#xff09;&#xff1a; 用于存储低位部分。在除法中保存商&#xff0c;在乘法中保存乘数&#xff0c;所以也叫乘商寄存器 左移 8 位&#xff08;相当于乘以 256&#xff09…

AI产品经理的转行之路,如何迈向年薪80w的职业高峰?

前言 在当今科技日新月异的时代&#xff0c;AI产品经理作为一个炙手可热的职业&#xff0c;吸引了众多向往高薪与前沿领域结合的求职者的目光。年薪80万的诱惑力无疑是巨大的&#xff0c;但不少自学中的朋友发现&#xff0c;即便涉猎广泛的产品知识&#xff0c;想要顺利转型成…

掌握Python的全方位教程,2024年最新版本,初学者必备指南

哈喽&#xff0c;大家好&#xff01;热烈欢迎你迈出成为python开发者的第一步。我想这一定非常激动人心&#xff0c;对吧&#xff1f;无论你是刚刚开始学习编程&#xff0c;还是曾经用过其他语言有一定的编程经验&#xff0c;本书中课程将帮助你加速实现你学习python的目标。作…

2024第十六届亚洲水技术展览会Aquatech China

Aquatech China 2024第十六届亚洲水技术展览会 专注水行业覆盖全领域—荷兰阿姆斯特丹水展中国展 2024.12.11-13 上海新国际博览中心 展会背景 Aquatech品牌创立于1968年。作为水处理行业历史悠久 的展览会&#xff0c;荷兰国际水处理展览会(Aquatech Amsterdam)至今已有近55…

物联网8大协议介绍及对比

一.物联网主流协议介绍 1.MQTT 协议 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;即消息队列遥测传输。 MQTT 协议最初是在 1999 年由 IBM 公司开发的&#xff0c;用于将石油管道上的传感器与卫星相连接。2014 年正式成为 OASIS 开放标准。 MQTT 使用…

车圈内卷的真相:技术创新与长期主义的存亡之战

引言 随着中国汽车市场的不断发展&#xff0c;行业竞争也日趋激烈。近期&#xff0c;在2024年6月6日举行的中国汽车重庆论坛上&#xff0c;多位汽车界大佬就“内卷”问题展开了激烈讨论。本文将详细分析这些讨论内容&#xff0c;揭示汽车行业内卷的真实情况及其背后的深层次原…

怎么选海外仓操作管理系统才能满足amazon电商需求?考虑好这些,做好FBA并不难

对于跨境电商领域来说&#xff0c;amazon一定是绕不过去的一个平台。不过想做好这个平台的业务并不容易&#xff0c;一方面是现在竞争确实越来越大&#xff0c;另一个是现在电商平台对海外仓业务水平的要求也越来越高。 尤其是对一些中小型的海外仓来说&#xff0c;如何高效、…

Autoware 定位之EKF 滤波定位(四)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

新火种AI|摊上事儿了!13名OpenAI与谷歌员工联合发声:AI失控可能导致人类灭绝...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年&#xff0c;OpenAI的CEO Sam Altman就没有清闲过&#xff0c;他似乎一直走在解决麻烦的路上。最近&#xff0c;他的麻烦又来了。 当地时间6月4日&#xff0c;13位来自OpenAI和Google Deep Mind的现任及前任员工联合发布了…

几首音乐怎么合成一首?值得推荐的四个几首音乐合成一首的方法

几首音乐怎么合成一首&#xff1f;合成几首音乐成一首新的作品是一项创造性而充满挑战的任务。通过将不同的音乐元素融合在一起&#xff0c;可以创造出独特的音乐体验&#xff0c;展示多样化的音乐风格和个性。将多首音乐合成一首可以创造出独特的音乐体验&#xff0c;融合不同…

PyTorch 维度变换-Tensor基本操作

以如下 tensor a 为例&#xff0c;展示常用的维度变换操作 >>> a torch.rand(4,3,28,28) >>> a.shape torch.Size([4, 3, 28, 28])view / reshape 两者功能完全相同: a.view(shape) >>> a.view(4,3,28*28) ## a.view(4,3,28,28) 可恢复squeeze…

二叉树左右树交换

leetcode 226题 翻转二叉树 题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3]…

计划任务 之 一次性的计划任务

计划任务 作用:定时自动完成特定的工作 计划任务的分类&#xff1a; &#xff08;1&#xff09;一次性的计划任务 例如下周三对系统的重要文件备份一次 &#xff08;2&#xff09;周期性重复计划任务 例如每天晚上12&#xff1a;00备份一次 一次性的任务计划&#xff1a…

linux的du命令简介

文章目录 linux的du命令简介du命令详解查看某个目录下 文件个数 linux的du命令简介 du命令是linux系统里的文件大小查看的命令。 du命令的应用场景十分广泛&#xff1a; 需要查看单个目录里面多个文件总大小。 需要查看目录中每个文件的大小以及每个子文件夹中文件的大小。 查…

opencv_核心操作

图像基本操作 访问和修改像素值 import numpy as np import cv2 img cv2.imread(c:/Users/HP/Downloads/basketball.png) h,w,c img.shape #图像大小 print(h,w,c)### 841 1494 3# 通过行和列坐标访问像素值 img[100,100]### 231 ### array([231, 140, 146], dtypeuint8)# …

Windows下 CLion中,配置 OpenCV、LibTorch

首先按照win下C部署深度学习模型之clion配置pytorchopencv教程记录 步骤配置。 LibTorch 部分 在测试LibTorch时会出现类似 c10.dll not found 的问题&#xff08;Debug才有&#xff09;&#xff1a; 参考C部署Pytorch&#xff08;Libtorch&#xff09;出现问题、错误汇总和 …

高内聚与低耦合:工作中的重要性与应用

目录 前言 1.什么是高内聚与低耦合&#xff1f; 2.为什么高内聚和低耦合非常重要&#xff1f; 3.工作中的运用 总结 前言 在软件开发领域&#xff0c;高内聚与低耦合是设计原则中非常重要的概念。高内聚指的是模块内部的各个元素紧密地结合在一起&#xff0c;完成单一的功…

解决Android Studio Iguana版本不显示原创的GradleTask问题

问题描述&#xff1a; 下面是我的AndroidStudio版本号&#xff0c;升级后我发现项目里面自定义的gradletask找不到了&#xff1f;&#xff1f;&#xff1f; 解决方案&#xff1a; 1、去setting里面把下面红框里面的选项勾选一下&#xff0c;缺点就是sync的时候会慢一些。 2、…

芯片级激光器研发取得新进展

欢迎关注GZH《光场视觉》 自 20 世纪 60 年代以来&#xff0c;激光给世界带来了革命性的变化&#xff0c;如今已成为从尖端手术和精密制造到光纤数据传输等现代应用中不可或缺的工具。 但是&#xff0c;随着激光应用需求的增长&#xff0c;挑战也随之而来。例如&#xff0c;光…

具有P柱中N点区域的超结MOSFET,用于软恢复

来源&#xff1a;Superjunction MOSFET with an N-dot region in the P-pillar for Soft Reverse Recovery&#xff08;ISPSD 24年&#xff09; 摘要 在本文中&#xff0c;提出了一种新型的具有P柱中N点区域的超结MOSFET&#xff0c;并进行了实验研究。利用硼和砷扩散速率的差…