Qt 绘图详解

文章目录

      • 头文件和构造函数
      • 启用反锯齿功能
      • 绘制矩形
      • 绘制圆角矩形
      • 绘制椭圆
      • 绘制圆弧
      • 绘制弦
      • 绘制凸多边形
      • 绘制图片
      • 绘制直线
      • 绘制多条直线
      • 绘制多点连接的线
      • 绘制路径
      • 绘制扇形
      • 绘制点
      • 绘制文本
      • 擦除矩形区域
      • 填充矩形
      • 填充路径

头文件和构造函数

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

启用反锯齿功能

首先,我们在每个图形的绘制过程中启用反锯齿功能,以保证绘制效果的平滑。

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    // 以下为具体图形的绘制代码
}

绘制矩形

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);

    // 画笔样式
    pen.setCapStyle(Qt::FlatCap); // 线端点样式
    pen.setJoinStyle(Qt::BevelJoin); // 线连接点样式

    // 给画家设置画笔
    painter.setPen(pen);

    // 设置画刷
    QBrush brush;
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);

    // 给画家设置画刷
    painter.setBrush(brush);

    // 绘制矩形
    QRect rect(60, 60, 400, 400);
    painter.drawRect(rect);
}

解释:

  • QPen 用于设置画笔的宽度、颜色、线端点样式和连接点样式。
  • QBrush 用于设置填充颜色和样式。
  • QRect 定义了矩形的尺寸和位置。
  • painter.drawRect(rect) 使用指定的画笔和画刷绘制矩形。

绘制圆角矩形

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 设置画刷
    QBrush brush;
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);

    // 绘制圆角矩形
    QRect roundedRect(20, 20, 400, 300);
    painter.drawRoundedRect(roundedRect, 20, 20);
}

解释:

  • painter.drawRoundedRect 绘制带圆角的矩形。
  • 20, 20 指定了圆角的水平和垂直半径。

绘制椭圆

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 设置画刷
    QBrush brush;
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);

    // 绘制椭圆
    QRect ellipseRect(20, 20, 400, 300);
    painter.drawEllipse(ellipseRect);
}

解释:

  • painter.drawEllipse 使用指定的矩形边界绘制椭圆。

绘制圆弧

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制圆弧
    QRect arcRect(20, 20, 400, 400);
    // 起始角和伸缩角必须以1/16度指定,即一个完整的圆等于5760(16 * 360)。
    // 角度的正值表示逆时针方向,负值表示顺时针方向
    // 零度在3点钟方向(参考手表的位置)
    painter.drawArc(arcRect, 0 * 16, 90 * 16);
}

解释:

  • painter.drawArc 绘制圆弧。
  • 0 * 1690 * 16 分别表示起始角度和跨越角度,单位为1/16度。

绘制弦

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制弦
    QRect chordRect(20, 20, 400, 400);
    painter.drawChord(chordRect, 0 * 16, 120 * 16);
}

解释:

  • painter.drawChord 绘制弦,弦是一个连接圆弧两个端点的线段。

绘制凸多边形

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制凸多边形
    QPoint convexPoints[4] = {
        {50, 100},
        {100, 50},
        {500, 160},
        {110, 400}
    };
    painter.drawConvexPolygon(convexPoints, 4);
}

解释:

  • painter.drawConvexPolygon 绘制凸多边形。
  • QPoint 数组定义了多边形的顶点。

绘制图片

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 绘制图片
    QRect imageRect(10, 10, 400, 300);
    QImage image(":/JINGMAO.jpg");
    painter.drawImage(imageRect, image);
}

解释:

  • painter.drawImage 在指定的矩形区域内绘制图片。

绘制直线

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制直线
    QLine line(50, 50, 400, 400);
    painter.drawLine(line);
}

解释:

  • QLine 定义了直线的起点和终点。
  • painter.drawLine 绘制直线。

绘制多条直线

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制多条直线
    QRect rect(50, 50, 400, 300);
    QVector<QLine> lines;
    lines.append(QLine(rect.topLeft(), rect.topRight()));
    lines.append(QLine(rect.bottomLeft(), rect.topRight()));
    lines.append(QLine(rect.topLeft(), rect.bottomRight()));
    painter.drawLines(lines);
}

解释:

  • QVector<QLine> 用于存储多条直线。
  • painter.drawLines 绘制多条直线。

绘制多点连接的线

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制多点连接的线
    QPoint points[5] = {
        {50, 100},
        {100, 50},
        {500, 160},
        {200, 200},
        {110, 400}
    };
    painter.drawPolyline(points, 5);
}

解释:

  • QPoint 数组定义了

多点连接的线的顶点。

  • painter.drawPolyline 绘制多点连接的线。

绘制路径

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制路径
    QRect rect(50, 50, 400, 300);
    QPainterPath path;
    path.addEllipse(rect);
    path.addRect(rect);
    painter.drawPath(path);
}

解释:

  • QPainterPath 用于定义复杂的路径。
  • painter.drawPath 绘制由 QPainterPath 对象定义的路径。

绘制扇形

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制扇形
    QRect rect(50, 50, 400, 300);
    painter.drawPie(rect, 0 * 16, 120 * 16); // 0 度是 3 点钟方向
}

解释:

  • painter.drawPie 绘制扇形。

绘制点

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 绘制单个点
    painter.drawPoint(QPoint(100, 200));

    // 绘制多个点
    QPoint points[4] = {
        {50, 100},
        {100, 50},
        {500, 160},
        {110, 400}
    };
    painter.drawPoints(points, 4);
}

解释:

  • painter.drawPoint 绘制单个点。
  • painter.drawPoints 绘制多个点。

绘制文本

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 设置字体
    QFont font;
    font.setFamily("微软雅黑");
    font.setPointSize(30);
    font.setBold(true);
    painter.setFont(font);

    // 绘制文本
    QRect rect(100, 100, 400, 200);
    painter.drawText(rect, "刘琴小宝贝");
}

解释:

  • QFont 设置字体属性。
  • painter.drawText 在指定的矩形区域内绘制文本。

擦除矩形区域

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 绘制图片
    QRect rect(10, 10, 400, 300);
    QImage image(":/JINGMAO.jpg");
    painter.drawImage(rect, image);

    // 设置窗口背景色
    setPalette(QPalette(Qt::red));

    // 擦除矩形区域
    QRect rect2(100, 100, 200, 100);
    painter.eraseRect(rect2);
}

解释:

  • painter.eraseRect 擦除指定的矩形区域内容。

填充矩形

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 填充矩形
    QRect rect(10, 10, 400, 300);
    painter.fillRect(rect, Qt::blue);
}

解释:

  • painter.fillRect 使用指定的颜色填充矩形区域。

填充路径

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    painter.setPen(pen);

    // 定义路径并填充
    QRect rect(10, 10, 400, 300);
    QPainterPath path;
    path.addRect(rect);
    path.addEllipse(rect);
    painter.fillPath(path, Qt::blue);
}

解释:

  • QPainterPath 用于定义复杂的路径。
  • painter.fillPath 使用指定的颜色填充路径。

通过以上这些代码示例和详细解释,相信你已经掌握了在Qt中进行各种图形绘制的方法。Qt的绘图功能非常强大,能够满足各种复杂的绘图需求。

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

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

相关文章

机器学习第四十六周周报 FMP

文章目录 week46 FMP摘要Abstract1. 题目2. Abstract3. FMP3.1 优化框架3.2 优化器 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.代码复现1. FMP2. fairGNN小结参考文献 week46 FMP 摘要 本周阅读了题为Chasing Fairness in Graphs: A GNN Architecture Per…

初识java—jdk17的一些新增特性

文章目录 前言一 &#xff1a; yield关键字二 &#xff1a;var关键字三 &#xff1a;密封类四 &#xff1a;空指针异常&#xff1a;五&#xff1a;接口中的私有方法&#xff1a;六&#xff1a;instanceof关键字 前言 这里介绍jdk17相对于jdk1.8的部分新增特性。 一 &#xff…

Spring Boot的无缝衔接:深入解析与实践

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ &#x1f680;The begin&#x1f697;点点关注&#xff0c;收藏不迷路&#x1f6a9; 引言 在快速迭代的软件开发环境中&#xff0c;无缝衔接是提升开发效率、降低维护成本、增强系统稳定性的关键。Spring Boo…

STM32芯片系列与产品后缀解读

一. 产品系列 STM32单片机是一系列基于ARM Cortex-M内核的32位微控制器&#xff0c;广泛应用于嵌入式系统中。 STM32系列由STMicroelectronics&#xff08;意法半导体&#xff09;开发和生产&#xff0c;并凭借其灵活的设计、丰富的外设和强大的生态系统&#xff0c;成为嵌入式…

LLM - 卷积神经网络(CNN)

1. 卷积神经网络结构&#xff1a;分为输入层&#xff0c;卷积层&#xff0c;池化层&#xff0c;全连接层&#xff1b; &#xff08;1&#xff09;首先进入输入层&#xff0c;对数据数据进行处理&#xff0c;将输入数据向量化处理&#xff0c;最终形成输入矩阵。 &#xff08;…

C++ 什么是虚函数?什么是纯虚函数,以及区别?(通俗易懂)

&#x1f4da; 当谈到虚函数时&#xff0c;通常是指在面向对象编程中的一种机制&#xff0c;它允许在派生类中重写基类的函数&#xff0c;并且能够通过基类指针或引用调用派生类中的函数。 目录 前言 &#x1f525; 虚函数 &#x1f525; 纯虚函数 &#x1f525; 两者区别…

用 Echarts 画折线图

https://andi.cn/page/621503.html

leetcode每日一题-3033. 修改矩阵

题目描述&#xff1a; 解题思路&#xff1a;简单题目&#xff0c;思路非常直接。对列进行遍历&#xff0c;记录下最大值&#xff0c;然后再遍历一遍&#xff0c;把-1替换为最大值。需要注意的是进行列遍历和行遍历是不同的。 官方题解&#xff1a; class Solution { public:v…

VRay渲染有什么技巧?渲染100邀请码1a12

渲染是视觉行业非常重要的一环&#xff0c;没有渲染就没有效果图&#xff0c;常用的渲染器有Vray&#xff0c;而Vray渲染有很多技巧&#xff0c;可以让渲染更快更省&#xff0c;下面我们总结下。 1、删除无用对象 检查场景&#xff0c;看是否有一些不需要渲染的物体和灯光&am…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接&#xff1a; https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中&#xff0c;多智能体合作问题因原始感官观察、高昂…

绝区肆--2024 年AI安全状况

前言 随着人工智能系统变得越来越强大和普及&#xff0c;与之相关的安全问题也越来越多。让我们来看看 2024 年人工智能安全的现状——评估威胁、分析漏洞、审查有前景的防御策略&#xff0c;并推测这一关键领域的未来可能如何。 主要的人工智能安全威胁 人工智能系统和应用程…

el-date-picker 设置默认值为当前日期

this.listQuery.Date new Date().toISOString().substr(0, 10); <el-date-picker v-model"listQuery.Date" format"yyyy-MM-dd" value-format"yyyy-MM-dd" type"date" placeholder"选择日期" change"getList()&qu…

Java语言程序设计篇一

Java语言概述 Java语言起源编程语言最新排名名字起源Java语言发展历程Java语言的特点Java虚拟机垃圾回收Java语言规范Java技术简介Java程序的结构Java程序注意事项&#xff1a;注释编程风格练习 Java语言起源 1990年Sun公司提出一项绿色计划。1992年语言开发成功最初取名为Oak…

Blender新手入门笔记收容所(一)

基础篇 基础操作 视角的控制 控制观察视角&#xff1a;鼠标中键平移视图&#xff1a;Shift鼠标中键缩放视图&#xff1a;滚动鼠标中键滚轮 选中物体后&#xff1a;移动物体快捷键G&#xff0c;移动后单击鼠标就会定下来。 进入移动状态后&#xff1a;按Y会沿着Y轴移动进入移动…

成人高考本科何时报名-深职训学校帮您规划学习之路

你有想过继续深造自己的学历吗&#xff1f;也许你已经工作多年&#xff0c;但总觉得学历是一块心病&#xff0c;想要通过成人高考本科来提升自己。不用着急&#xff0c;今天我们来聊一聊成人高考本科的报名时间&#xff0c;以及深职训学校如何帮助你顺利完成报名。 深圳成人高…

2024上半年网络工程师考试《应用技术》试题一

阅读以下说明&#xff0c;回答问题。 【说明】 MPLS基于(1)进行转发&#xff0c;进行MPLS标签交换和报文转发的网络设备称为(2)&#xff0c;构成MPLS域(MPSDomain)。位于MPLS域边缘、连接其他网络的LSR称为(3),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时&#xf…

文件管理下:文件函数的学习

前言 Hello,小伙伴们你们的作者君又来了&#xff0c;上次我们简单介绍了文件的坐拥并简单提到了数据的读取&#xff0c;和C语言的默认流的作用&#xff0c;今天我将继续带领大家探索文件的奥秘&#xff0c;大家准别好了吗&#xff1f; 在内容开始之前还是按照惯例&#xff0c…

Alt与Tab切换窗口时将Edge多个标签页作为一个整体参与切换的方法

本文介绍在Windows电脑中&#xff0c;使用Alt与Tab切换窗口时&#xff0c;将Edge浏览器作为一个整体参与切换&#xff0c;而不是其中若干个页面参与切换的方法。 最近&#xff0c;需要将主要使用的浏览器由原本的Chrome换为Edge&#xff1b;但是&#xff0c;在更换后发现&#…

Python爬虫系列-让爬虫自己写爬虫(半自动化,代替人工写爬虫)

现在的PC、手机客户端等终端设备大量使用了网页前后端技术&#xff0c;另外主流的网站也会经常会更新&#xff0c;导致以前一个月更新一次爬虫代码&#xff0c;变成了天天需要更新代码&#xff0c;所以自动化爬虫技术在当前就显得特别重要&#xff0c;最近我也是在多次更新某个…

Java | Leetcode Java题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {int n nums.length;Map<Long, Long> map new HashMap<Long, Long>();long w (long) t 1;for (int i 0; i < n; i) {long i…