一文带你入门 - Qt绘图QPainter

news2024/12/23 20:07:11

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,高度100
      painter.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.coloradmin.cn/o/1812260.html

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

相关文章

探秘C++ STL中的Stack与Queue:数据结构的艺术与实践

在C的世界里&#xff0c;标准模板库(STL)无疑是一颗璀璨的明珠&#xff0c;它不仅极大地丰富了C的生态系统&#xff0c;更为开发者提供了强大的工具箱。其中&#xff0c;stack和queue作为两种基础而重要的数据结构&#xff0c;扮演着不可或缺的角色。本文将深入剖析这两个容器适…

国内著名的四个“大模型”

关于您提到的国内四大模型&#xff0c;这里为您详细介绍&#xff1a; 文心大模型&#xff1a;文心大模型是百度自主研发的产业级知识增强大模型。它以创新性的知识增强技术为核心&#xff0c;从单模态大模型发展到跨模态&#xff0c;从通用基础大模型到跨领域、跨行业&#xff…

英特尔为何大力押注边缘AI

正如近期历史上所有AI领域的情况一样&#xff0c;边缘AI部署也未能免受指数级增长的影响。 随着钟摆从集中式部署转向分布式部署&#xff0c;AI推动了边缘计算的大部分增长&#xff0c;组织越来越多地希望将AI算法和模型部署到本地边缘设备上&#xff0c;消除了不断依赖云基础设…

程序员们,如何预防大龄危机?

困境 在中国&#xff0c;程序员到了35岁&#xff0c;基本是一个坎&#xff0c;如果你还是通过常规的招聘网或者猎头去找工作&#xff0c;能拿到offer的比例相对低&#xff0c;因为跟新手程序员比&#xff0c;你没有明显的优势。 论薪资&#xff1a; 大龄程序员的薪资要求应该…

3.Nginx配置文件基本介绍

nginx配置文件所在路径&#xff1a;/usr/local/nginx/conf/nginx.conf nginx配置文件有三块&#xff1a; 1.全局块 从配置文件开始到events块之间的内容&#xff0c;主要会设置一些影响nginx服务器整体运行的配置指令。 配置运行nginx服务器的用户(组)允许生成的worker pro…

stm32 Listings和Objects文件夹目录设置

我们在test.c文件里面输入如下代码&#xff1a; #include "sys.h" #include "usart.h" #include "delay.h" int main(void) { u8 t0; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_i…

探索Android异步编程:Coroutine与RxJava的差异及实例分析

探索Android异步编程&#xff1a;Coroutine与RxJava的差异及实例分析 在Android开发中&#xff0c;处理异步操作&#xff08;例如网络请求或数据库操作&#xff09;是一项常见任务。传统的回调方法虽然能解决问题&#xff0c;但代码复杂且难以维护。为了解决这些问题&#xff…

修复错误提示“由于找不到msvcr120.dll,无法继续执行代码”的几种方法

当你的电脑出现“由于找不到msvcr120.dll,无法继续执行代码”的错误提示时&#xff0c;首先&#xff0c;需要确定您的系统中是否缺少或损坏了msvcr120.dll文件。这可以通过运行程序时收到类似“无法启动程序&#xff0c;因为msvcr120.dll丢失”或“找不到msvcr120.dll”等错误信…

6.结构体

目录 一、普通结构体&#xff08;struct&#xff09;1.1 说明1.2 举例1&#xff09;结构体定义及访问2&#xff09;结构体初化的简单写法3&#xff09;结构体更新语法 二、元组结构体&#xff08;tuple struct&#xff09;2.1 概念2.2 示例 三、类单元结构体&#xff08;unit-l…

贪 吃 蛇

简介 简易贪吃蛇&#xff0c;使用 javax.swing 组件构建游戏界面&#xff0c;通过监听键盘按键实现游戏操纵。 功能设计 按1 - 开始游戏按2 - 重新开始按3 - 暂停/继续按Esc-退出游戏统计吃到的苹果个数&#xff08;得分&#xff09;难度控制&#xff0c;得分超过阈值时难度…

计算机内存分类

1&#xff0c;非易失性存储器。 断电时&#xff0c;存储器的内容不会丢失&#xff0c;并且 加电时再次可用。这对于处理器启动或重启时使用的引导代码是必需的。 o ROM&#xff1a;只读存储器&#xff1b;此存储器的内容在制造过程中定义 设备。一旦发生错误&#xff0c;芯片…

推荐系统学习笔记(五)-----双塔模型

目录 双塔模型 训练 pointwise训练 pairwise训练 listwise训练 双塔模型 矩阵补充模型只用到了用户id和物品id&#xff0c;其余属性没有用上 用户属性也可以这样处理 用户塔和物品塔各输出一个向量&#xff0c;两个向量的余弦相似度作为兴趣的预估值 训练 第一种&#x…

VFP发送邮件有哪些配置要求?如何使用VFP?

VFP发送邮件支持的邮件服务器&#xff1f;邮件发送功能怎么优化&#xff1f; 在如今的互联网时代&#xff0c;应用程序发送邮件功能几乎是不可或缺的&#xff0c;VFP也不例外。然而&#xff0c;要实现VFP发送邮件&#xff0c;需要了解并配置相关的要求和步骤。AokSend将详细介…

如何查看个人大数据信用报告?查询报告哪家好呢?

大数据信用报告是现代社会中非常重要的信用评估工具&#xff0c;对于个人来说也具有非常重要的意义。那么&#xff0c;如何查看个人大数据信用报告?查询报告哪家好呢?本文将为您介绍。 首先&#xff0c;查看个人大数据信用报告需要了解报告的内容和格式 一般来说&#xff0c;…

【Python】Flask问答系统Demo项目

学习视频 我是跟着知了传课学的Flask&#xff0c;起初了解Flask还是GPT告诉我的&#xff0c;现在可以说用Flask做后端是真的方便&#xff01; https://www.bilibili.com/video/BV17r4y1y7jJ 项目结构与下载 FlaskOA&#xff08;项目文件夹&#xff09; │ app.py │ conf…

skywalking9.4 链路追踪

下载&#xff0c;很慢很慢很慢&#xff01;&#xff01;&#xff01;&#xff01; jdk 使用jdk17 skywalking-apm 9.4 java-agent 9.0 idea 本地开发配置 第1行配置按实际来&#xff1b; 第2行自定义&#xff0c;一般和微服务名称相同&#xff1b; 第3行ip写安装的机器ip,端…

同余式,乘法逆元,费马小定理

同余式 同余式是 数论 的基本概念之一&#xff0c;设m是给定的一个正整数&#xff0c;a、b是整数&#xff0c;若满足m| (a-b)&#xff0c;则称a与b对模m 同余 &#xff0c;记为a≡b (mod m)&#xff0c;或记为a≡b (m)。 这个式子称为模m的同余式&#xff0c;若m∤ (a-b)&…

机器学习-支持向量机

目录 一支持向量机 1.支持向量机SVM 2构建svm目标函数 3.拉格朗日乘法&#xff0c;kkt条件 拉格朗日乘法&#xff1a; kkt条件 对偶问题 4.最小化SVM目标函数 kkt条件&#xff1a; 对偶转换&#xff1a; 5软间隔及优化 优化svm目标函数 构造拉格朗日函数 对偶转换关系…

orbslam2代码解读(4):loopclosing回环检测线程

书接上回&#xff0c;介绍完了局部建图线程&#xff0c;局部建图线程在进行局部BA之后&#xff0c;也会将新的关键帧mpLoopCloser放进回环线程的mlpLoopKeyFrameQueue容器中。所以这时候回环检测线程就根据这个新的关键帧来进行回环检测的操作。 回环检测的主要程序 // 线程主…

177.二叉树:从前序与中序遍历序列构造二叉树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…