QPaint绘制图形

news2024/12/23 3:07:57

流程

继承QWidget类,重写paintEvent方法,在其中使用QPainter进行绘图。

举例

创建项目,项目结构如下:

在这里插入图片描述

// widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    // 画笔颜色
    QColor m_outlineColor;
    // 刷子颜色
    QColor m_fillColor;

    // 在cpp文件重新painEvent方法
    void paintEvent(QPaintEvent *event) override;

    // 使用QPainter绘制矩形
    void drawRectangle(QPainter *painter);


private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

// widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QPainter>
#include <QBrush>
#include <QPen>

Widget::Widget(QWidget *parent)
  // 初始化列表,画笔颜色为黑色,刷子颜色为红色
    : QWidget(parent), m_outlineColor(Qt::black), m_fillColor(Qt::red)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    // 设置窗口大小350*350
    resize(350,350);

}

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

// 定义paintEvent方法
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QPainter painter(this);
  
    // 设置画笔
    // QPen用法见后面
    painter.setPen(QPen(m_outlineColor, 5, Qt::DashDotLine,Qt::RoundCap));
    // 设置画刷
    painter.setBrush(QBrush(m_fillColor, Qt::SolidPattern));

    drawRectangle(&painter);
}

// 绘制矩形
void Widget::drawRectangle(QPainter *painter)
{
    painter->drawRect(QRect(50,50,200,100));
}

main.cpp不作修改。

运行结果

在这里插入图片描述

常用的绘制函数

1、drawLine(x1, y1, x2, y2):画一条线段,起点为(x1, y1),终点为(x2, y2)

// 在paintEvent方法中调用即可
void Widget::drawLine(QPainter *painter)
{
    painter->drawLine(10,10,60,10);
}

2、drawRect(x, y, w, h):绘制一个矩形,左上角坐标为(x, y),宽度为w,高度为h

void Widget::drawRectangle(QPainter *painter)
{
    painter->drawRect(QRect(50,50,200,100));
}

3、drawEllipse(x, y, w, h):绘制一个椭圆形,左上角坐标为(x, y),宽度为w,高度为h

void Widget::drawEllipse(QPainter *painter)
{
    painter->drawEllipse(250,50,100,80);
}

4、drawText(x, y, text):在指定的坐标(x, y)上绘制文本text

void Widget::drawText(QPainter *painter)
{
    QFont font = QFont("Arial",16);
    painter->setFont(font);
    painter->drawText(50,200,"hello Qt");

}

setPen用法

setPen函数是Qt中QPainter类的一个函数,用于设置绘制图形的画笔属性。
函数声明如下:

void setPen(const QPen &pen);

参数为一个QPen类型的对象,用于指定画笔属性,如颜色、线宽、线型等。例如,我们可以使用setPen函数来设置画笔颜色为红色:

QPen pen(Qt::red);
painter.setPen(pen);

也可以使用链式写法来设置画笔属性:

painter.setPen(QPen(Qt::red, 2, Qt::DashLine));

其中,第一个参数为画笔颜色,第二个参数为线宽,第三个参数为线型,第四个参数为画笔端点的风格,第五个参数为画笔连接点的风格

  • QPen的第三个参数,它是一个 Qt::PenStyle 枚举类型,常用的线型如下:

    • Qt::SolidLine:实线

    • Qt::DashLine:短横线

    • Qt::DotLine:点线

    • Qt::DashDotLine:短横点线

    • Qt::DashDotDotLine:短横双点线

  • QPen的第四个参数表示画笔端点的风格,它是一个 Qt::PenCapStyle 枚举类型,常用的类型如下:

    • Qt::SquareCap:方形端点

    • Qt::FlatCap:平底端点

    • Qt::RoundCap:圆形端点

QBrush用法

QBrush是Qt中的画刷类,用于设置绘制图形的填充颜色或者填充图片等属性。在Qt的绘图中,使用QBrush常常和QPainter一起使用,用来设置绘制图形的填充属性。

常用的QBrush构造函数有以下几种:

QBrush(); // 默认画刷
// 第一个参数指定颜色,如Qt::red
// 第二个参数指定填充风格
// Qt::SolidPattern 实心填充
// Qt::DiagCrossPattern 斜向填充
QBrush(const QColor &color, Qt::BrushStyle style = Qt::SolidPattern); // 指定颜色和填充风格
QBrush(const QPixmap &pixmap); // 使用图片填充画刷

实例

// widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    QColor m_outlineColor;
    QColor m_fillColor;

    void paintEvent(QPaintEvent *event) override;

    // 绘制矩形
    void drawRectangle(QPainter *painter);

    // 绘制直线
    void drawLine(QPainter *painter);

    // 绘制椭圆
    void drawEllipse(QPainter *painter);

    // 绘制文本
    void drawText(QPainter *painter);


private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

// widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QDateTime>
#include <QPainter>
#include <QBrush>
#include <QPen>

Widget::Widget(QWidget *parent)
    : QWidget(parent), m_outlineColor(Qt::black), m_fillColor(Qt::red)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    resize(350,350);

}

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

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QPainter painter(this);
    painter.setPen(QPen(m_outlineColor, 5, Qt::SolidLine));
    painter.setBrush(QBrush(m_fillColor, Qt::DiagCrossPattern));

    drawRectangle(&painter);
    drawLine(&painter);
    drawEllipse(&painter);
    drawText(&painter);
}

void Widget::drawRectangle(QPainter *painter)
{
    painter->drawRect(50,50,200,100);
}

void Widget::drawLine(QPainter *painter)
{
    painter->drawLine(10,10,60,10);
}

void Widget::drawEllipse(QPainter *painter)
{
    painter->drawEllipse(250,50,100,80);
}

void Widget::drawText(QPainter *painter)
{
    QFont font = QFont("Arial",16);
    painter->setFont(font);
    painter->drawText(50,200,"hello Qt");

}

在这里插入图片描述

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

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

相关文章

TypeScript ~ TS 掌握编译文件配置项 ⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

git 上传下载

文章目录 gitee/GitHub 是用来做什么的&#xff1f;什么时候需要学习上传项目到 gitee&#xff1f;为什么要将本地项目上传到 gitee&#xff1f;创建 gitee 仓库&#xff1a;在本地新建一个项目将仓库拉取到本地使用 idea 实现项目的上传下载gitee 仓库查看 下面我就来为大家介…

第六章 习题(6789B)【计算机系统结构】

第六章 习题【计算机系统结构】 前言推荐第六章 习题678911 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第五章 作业&#xff08;149A&#xff09;【计算机系统结构】 答案参考&#xff1a; https://www.docin.com/p-28456…

LVDS (Low Voltage Differential Signaling)基础知识

LVDS(Low Voltage Differential Signaling&#xff09;: 是一种小振幅差分信号技术&#xff0c;它使用非常低的幅度信号 (250mV~450mv&#xff09;通过一对平行的 PCB 走线或平衡电缆传输数据。 在两条平行的差分信号线上流经的电流及电压振幅相反&#xff0c;噪声信号同时耦…

小鱼C python - 集合的练习

题一&#xff1a;用字典实现集合的去重特性 1. 生成100个1&#xff5e;100的随机值 思路&#xff1a; 1. range 范围 2. random.randint(a,b) import random x [] for I in range(100):x.append(random.randint(1,100)) print(x) 2. x和y的交集 思路&#xff1a;1.遍历x,…

通过 pGina 对 Windows 设备进行管理

文章目录 前言1、环境信息1.1、服务器端1.2、客户端 2、pGina 安装及配置2.1、下载并安装2.2、配置2.3、模拟测试2.4、Windows 远程登录测试 总结 前言 对 Windows 设备进行管理&#xff0c;一般是通过 AD 进行的&#xff0c;但是这玩意儿是收费的&#xff0c;而且还挺贵。有没…

SpringSecurity(二):自定义认证(源码+落地实现)。

自定义认证 自定义资源权限规则资源分类自定义资源权限规则为什么我们要自定义呢&#xff1f;如何去覆盖呢&#xff1f;WebSecurityConfigurerAdapter它是干什么用的实例 自定义登录界面步骤源码解析 自定义登录成功处理&#xff08;前后端分离的情况&#xff09;项目环境succe…

Axure中使用echarts图标

第一步&#xff1a;axure中防一个矩形框 第二步&#xff1a;将矩形框命名为Demo 这步很重要&#xff0c;后续会引用这个名字 第三步&#xff1a;打开Echarts示例&#xff0c;选择需要的样式&#xff0c;并调整数值 Examples - Apache ECharts 第四步&#xff1a;代码准备 需…

Windows10host文件修改方法

1、首先打开“此电脑”&#xff0c;定位到&#xff1a; C:\Windows\System32\drivers\etc 2、使用鼠标右键单击“hosts”&#xff0c;弹出来的菜单中选择“属性” 3、弹出“文件属性”窗口后单击“上方的”安全“栏”。 选中“ALL APPLICATON PACKAGES”后单击“编辑” 4、同…

Jmeter核心结构和运行原理(1)

Jmeter核心结构和运行原理 一、Jmeter核心结构和运行原理1、JMeter核心结构2、JMeter的体系结构3、JMeter运行原理a、GUI模式&#xff1a;b、非GUI模式&#xff1a;c、单机模式&#xff1a;d、分布式模式 一、Jmeter核心结构和运行原理 1、JMeter核心结构 测试计划 线程组 配…

MongoDB基本使用(一)

MongoDB基本使用 Nosql简介 NoSQL(NoSQL Not Only SQL )&#xff0c;意即”不仅仅是SQL”。 在现代的计算系统上每天网络上都会产生庞大的数据量&#xff0c; 这些数据有很大一部分是由关系数据库管理系统&#xff08;RDBMS&#xff09;来处理。 1970年 E.F.Codd’s提出的关系…

总结910

目标规划&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化5讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日规划 今日已做 1.早上回顾之前背诵的文章 2.写自我总结&#…

Java 中常见的数据结构

数据结构简介 数据结构是计算机科学中用于组织和存储数据的一种方式或方法。它定义了不同数据元素之间的关系&#xff0c;以及对这些数据元素进行操作和访问的规则和技术。 数据结构可以用来描述问题的抽象模型&#xff0c;并提供处理该问题的操作和算法。它可以通过逻辑和物…

wpf增加系统托盘图标

使用系统托盘&#xff0c;可以为用户提供一个简便快捷的操作习惯。 wpf中增加系统托盘图标有2种 第一种&#xff0c;使用Hardcodet.NotifyIcon.Wpf开源组件 1.建立一个wpf程序 2.安装Hardcodet.NotifyIcon.Wpf 3.增加图片 图片选择资源&#xff0c;否则获取不到路径 4.界面…

TypeScript - 函数(上)

目录 1、介绍 2、函数类型表达式 3、呼叫签名 4、构造签名 5、泛型函数 6、推论 7、约束 8、使用约束值 9、指定类型参数 1、介绍 函数是JavaScript应用程序的基础。 它帮助你实现抽象层&#xff0c;模拟类&#xff0c;信息隐藏和模块。 在TypeScript里&#xff0c…

Linux——进程的概念

task_struct task_struct 是linux下管理进程的结构&#xff0c;称为PCB&#xff0c;进程控制块。linux所有的指令本质上都是一个进程。进程 task_struct 进程的数据、代码、可执行程序&#xff0c;有属性、有内容。 进程是系统的工作单元。系统由多个进程组成&#xff0c;包…

Linux定时任务--crontab

linux内置了cron进程&#xff0c;cron搭配shell脚本&#xff0c;就可以完成特定的需求&#xff0c;有定时任务的效果。 crontab指令即cron table的简写&#xff0c;相关的配置文件目录如下&#xff1a; /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务&#xf…

论文笔记--On the Sentence Embeddings from Pre-trained Language Models

论文笔记--On the Sentence Embeddings from Pre-trained Language Models 1. 文章简介2. 文章概括3 文章重点技术3.1 BERT模型的语义相似度能力分析3.2 Anistropic各向异性3.3 BERT-flow3.4 Flow-based model 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#x…

树莓派Pico|RP2040简介|PINOUT|点灯示例

文章目录 一、Pico简介&#xff1a;二、几个比较重要的git仓库&#xff1a;三、使用前必读&#xff1a;四、PINOUT五、点灯一、如何安装固件二.安装Thonny编程环境配置三、点亮板载的LED灯Pico点亮板载LED灯的代码&#xff1a;PicoW点亮板载LED灯的代码&#xff1a; 一、Pico简…

[LeetCode周赛复盘] 第 107 场双周赛20230624

[LeetCode周赛复盘] 第 107 场双周赛20230624 一、本周周赛总结6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6895. 构造最长的新字符串1. 题目描述2. 思路分析3. 代码实现 6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6468. 统计没有收到请求…