qt5-入门-2D绘图-基础

news/2024/10/19 9:37:59/

参考:
QPainter_w3cschool
https://www.w3cschool.cn/learnroadqt/k7zd1j4l.html

C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt 5.12

代码已经测试通过。其他例子日后更新。


目录

  • 基础知识
    • pen
    • brush
    • 其他属性
  • 实例
    • 简单例子
    • Bezier曲线
    • 点击事件

基础知识

  • QPainter通过QPaintEngineQPainterDevice上进行绘制。如果希望使用OpenGL功能,应该使用QtOpenGL模块。
  • painter主要涉及三个设置:pen brush和font。font是用来写文字的,有字体和大小等属性。这些属性可以用QPenQBrushQFont对象调用setPen()setBrush()setFont()来设置。
  • 任何时候都可以使用save()将painter当前的状态保存到内部栈上,等需要恢复的时候使用restore()恢复。
  • QPainter是状态机,如果做了设置,只会影响设置之后的,直到下一次再设置才会改变,类似OpenGL。

pen

QPen是用来画线条和轮廓线的,包含的属性有颜色、线宽、line style、cap style、join style,后三个的含义见下图。
在这里插入图片描述

brush

brush指的是填充模式,包含的属性是颜色和样式。也可以是纹理(texture,a pixmap that is repeated infinitely)或者渐变(gradient)。
在这里插入图片描述
gradient
在这里插入图片描述

其他属性

  • brush下面的叫background,默认都是Qt::TransparentMode,如果改成Qt::OpaqueMode的话,可以设置background brush
  • brush的原点一般在左上角
  • clip 区域是可以绘图的区域,超过的部分不会显示

实例

简单例子

在这里插入图片描述

#ifndef PAINTEDWIDGET_H
#define PAINTEDWIDGET_H#include <QWidget>
#include <QPainter>class PaintedWidget : public QWidget
{
public:PaintedWidget() {resize(800, 600);setWindowTitle(tr("Paint Demo"));}protected:void paintEvent(QPaintEvent *event) {QPainter painter(this);// QPainter::Antialiasing是一个渲染提示类型,表示启用抗锯齿功能,使得绘制的边缘更加平滑// 看起来更加自然和清晰。当将第二个参数设置为true时,即表示启用了抗锯齿功能。painter.setRenderHint(QPainter::Antialiasing, true);painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));// x, y, width, heightpainter.drawEllipse(80, 80, 400, 240);}
};#endif // PAINTEDWIDGET_H// main
PaintedWidget* p = new PaintedWidget;
p->show();

Bezier曲线

在这里插入图片描述

    void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);QPainterPath path;// 移动到起点path.moveTo(80, 320); // 分别是第一个、第二个控制点和终点的坐标path.cubicTo(200, 80, 320, 80, 480, 320);painter.setPen(QPen(Qt::black, 8));painter.drawPath(path);}

点击事件

修改类,增加:

protected:void mousePressEvent(QMouseEvent *event) override;signals:void clicked();

实现:

void PaintedWidget::mousePressEvent(QMouseEvent *event) {emit clicked();
}

在使用的时候需要绑定槽函数:

// p 是 PaintedWidget类的对象
connect(p, &PaintedWidget::clicked, this, &MainWindow::drawImages);

http://www.ppmy.cn/news/1452600.html

相关文章

2-手工sql注入(进阶篇) sqlilabs靶场1-4题

1. 阅读&#xff0c;学习本章前&#xff0c;可以先去看看基础篇&#xff1a;1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战&#xff0c;关于sqlilabs靶场的搭建&#xff1a;Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap&#xff0c;关于sqlmap的命令&…

Java毕业设计 基于SSM 健身中心管理系统

Java毕业设计 基于SSM 健身中心管理系统 SSM 健身中心管理系统 功能介绍 首页 图片轮播 登录注册 场地展示 场地详情 立即租赁 课程展示 课程详情 课程预约 器材展示 器材详情 立即租赁 优惠信息展示 优惠详情 健身资讯 资讯详情 个人中心 收藏 我的预约 我的租赁 后台管理 …

最小费用流相位解包裹

% test_cunwrap.m % % Matlab script to test Costantinis unwrapping % Author: Bruno Luong <brunoluong@yahoo.com> % History: % Orginal: 27-Aug-2009clear all; close all; clc; I1=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.public_files\博士阶段\小…

k8s环境prometheus operator监控集群外资源

文章目录 k8s环境添加其他节点基于prometheus operator k8s环境prometheus operator添加node-exporter方式一&#xff1a;通过 ServiceMonitor 方式可以写多个监控node节点运行 external-node.yaml查看资源有没有被创建热更新 外部需要被监控服务器安装 node-exporterdocker 方…

BUUCTF---misc---[BJDCTF2020]纳尼

1、下载附件是一个gif图片&#xff0c;但是图片打不开 2、用winhex分析&#xff0c;看到缺少了文件头 3、将文件头通过ASCII码方式粘贴后&#xff0c;保存&#xff0c;图片恢复了正常 4、是一张动图&#xff0c;一共四张&#xff0c;每张都有base64编码 5、用stegsolve分解图…

分层图像金字塔变压器

文章来源&#xff1a;hierarchical-image-pyramid-transformers 2024 年 2 月 5 日 本文介绍了分层图像金字塔变换器 (HIPT)&#xff0c;这是一种新颖的视觉变换器 (ViT) 架构&#xff0c;设计用于分析计算病理学中的十亿像素全幻灯片图像 (WSI)。 HIPT 利用 WSI 固有的层次结…

STM32 F103C8T6学习笔记17:类IIC通信(SMBus协议)—MLX90614红外非接触温度计

今日学习配置MLX90614红外非接触温度计 与 STM32 F103C8T6 单片机的通信 文章提供测试代码讲解、完整工程下载、测试效果图 本文需要用到的大概基础知识&#xff1a;1.3寸OLED配置通信显示、IIC通信、 定时器配置使用 这里就只贴出我的 OLED驱动方面的网址链接了&#xff1a…

[方法] Unity 解决类《原神》角色移动方向问题

第三人称视角类的游戏有很多&#xff0c;比如《原神》、《崩坏:星穹铁道》、《剑星》、《绝地求生》等。这些游戏中&#xff0c;角色的移动方向取决于玩家的输入和相机的方向&#xff0c;例如玩家在键盘上按下D键&#xff0c;则角色会相对于相机方向向右移动&#xff0c;本篇文…