心中有坐标 万物皆可Paint

  • 封装LQCanvas类绘制各种基本图形
// lqcanvas.h
#ifndef LQCANVAS_H
#define LQCANVAS_H#include <QWidget>
#include <QMetaType>class LQCanvas : public QWidget
{Q_OBJECT
public:explicit LQCanvas(QWidget *parent = nullptr);public:void setBackgroundColor(const QColor &color);void setPenColor(const QColor&color);void setPenWidth(int width);void setType(const QString &type);private:void paintLuffy(QPainter &painter);protected:void paintEvent(QPaintEvent *event) override;private:QColor m_backgroundColor;QColor m_penColor;int m_penWidth;QString m_type;
};#endif // LQCANVAS_H// lqcanvas.cpp
#include "lqcanvas.h"#include <QPainter>LQCanvas::LQCanvas(QWidget *parent) : QWidget(parent)
{m_backgroundColor = QColor(0, 0, 0);m_penColor = QColor(255, 255, 255);m_penWidth = 2;m_type = "点";
}void LQCanvas::setBackgroundColor(const QColor &color)
{m_backgroundColor = color;
}void LQCanvas::setPenColor(const QColor &color)
{m_penColor = color;
}void LQCanvas::setPenWidth(int width)
{m_penWidth = width;
}void LQCanvas::setType(const QString &type)
{m_type = type;update();
}void LQCanvas::paintLuffy(QPainter &painter)
{QPen pen;pen.setColor(QColor(0, 0, 0));pen.setWidth(0);painter.setPen(pen);int headRadius = 252 >> 1;int headRectX = 200;int headRectY = 100;int headCenterX = headRectX + headRadius;int headCenterY = headRectY + headRadius;QRect headRect(headRectX, headRectY, headRadius * 2, headRadius * 2);// 十字骨头int boneRectWidth = 360;int boneRectHeight = 300;int boneRectX = headCenterX - boneRectWidth / 2;int boneRectY = headCenterY + 50 - boneRectHeight / 2;QRect boneRect(boneRectX, boneRectY, boneRectWidth, boneRectHeight);QPoint point1(boneRectX, boneRectY);QPoint point2(boneRectX + boneRectWidth, boneRectY);QPoint point3(boneRectX + 30, boneRectY + boneRectHeight - 20);QPoint point4(boneRectX + boneRectWidth - 30, boneRectY + boneRectHeight - 20);pen.setWidth(36);pen.setColor(QColor(255, 255, 255));painter.setPen(pen);painter.drawLine(point1, point4);painter.drawLine(point2, point3);
//    painter.drawRect(boneRect);pen.setWidth(0);pen.setColor(QColor(0, 0, 0));painter.setPen(pen);#if 1// 嘴巴int mouseRadius = headRadius + 50;int mouseRectX = headCenterX - mouseRadius;int mouseRectY = headCenterY - mouseRadius;QRect mouseRect(mouseRectX, mouseRectY, mouseRadius * 2, mouseRadius * 2);painter.setBrush(QBrush(QColor(255, 255, 255)));// 下巴int pawRectWidth = 150;int pawRectHeight = 120;int pawRectX = headCenterX - pawRectWidth / 2;int pawRectY = headCenterY + mouseRadius - 80;QRect pawRect(pawRectX, pawRectY, pawRectWidth, pawRectHeight);painter.drawChord(pawRect, 0, -180 * 16);painter.drawPie(mouseRect, -65 * 16, -50 * 16);// 骷髅头下半部分painter.setBrush(QBrush(QColor(255, 255, 255)));painter.drawChord(headRect, 0, -180 * 16);// 眼睛painter.setBrush(QBrush(QColor(0, 0, 0)));int eyeToCenterX = 70;int eyeToCenterY = 20;int eyeRadius = 30;QRect leftEyeRect(headCenterX - eyeToCenterX, headCenterY + eyeToCenterY, eyeRadius * 2, eyeRadius * 2);QRect rightEyeRect(headCenterX + eyeToCenterX - eyeRadius * 2, headCenterY + eyeToCenterY, eyeRadius * 2, eyeRadius * 2);painter.drawChord(leftEyeRect, 0, 360 * 16);painter.drawChord(rightEyeRect, 0, 360 * 16);// 鼻子int noseWidth = 26;int noseHeight = 18;int noseX = headCenterX - noseWidth / 2;int noseY = headCenterY + 90;QRect noseRect(noseX, noseY, noseWidth, noseHeight);painter.drawChord(noseRect, 0, 360 * 16);// 草帽painter.setBrush(QBrush(QColor(255, 0, 0)));painter.drawChord(headRect, 0, 180 * 16);painter.setBrush(QBrush(QColor(255, 255, 0)));painter.drawChord(headRect, 15 * 16, 150 * 16);// 帽檐int capRectWidth = headRadius * 2 + 80;int capRectHeight = 18;int capRectX = headCenterX - capRectWidth / 2;int capRectY = headCenterY - capRectHeight / 2;QRect capRect(capRectX, capRectY, capRectWidth, capRectHeight);painter.setBrush(QBrush(QColor(255, 255, 0)));painter.drawRoundedRect(capRect, capRectHeight / 2, capRectHeight / 2);
#endif
}void LQCanvas::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);// 获取中心点int width = this->width();int height = this->height();int centerX = width >> 1;int centerY = height >> 1;QPainter painter(this);// 设置反走样painter.setRenderHint(QPainter::Antialiasing);// 绘制背景painter.setBrush(QBrush(m_backgroundColor));painter.drawRect(rect());// 设置画笔QPen pen;pen.setColor(m_penColor);pen.setWidth(m_penWidth);painter.setPen(pen);// 取消填充色painter.setBrush(QBrush());if ("点" == m_type) {painter.drawPoint(centerX, centerY);} else if ("线" == m_type) {painter.drawLine(centerX, centerY - 20, centerX, centerY + 20);painter.drawLine(centerX - 20, centerY, centerX + 20, centerY);} else if ("三角形" == m_type) {// 没有绘制三角形的接口,需调用绘制多边形的接口QPoint point[3];point[0] = QPoint(centerX, centerY - 20);point[1] = QPoint(centerX - 20, centerY + 20);point[2] = QPoint(centerX + 20, centerY + 20);painter.drawPolygon(point, 3);} else if ("正方形" == m_type) {QRect rect(centerX - 20, centerY - 20, 40, 40);painter.drawRect(rect);} else if ("长方形" == m_type) {QRect rect(centerX - 40, centerY - 20, 80, 40);painter.drawRect(rect);} else if ("圆形" == m_type) {// 在正方形中绘制会则为圆形QRect rect(centerX - 20, centerY - 20, 40, 40);painter.drawEllipse(rect);} else if ("椭圆形" == m_type) {// 在长方形中绘制则为椭圆形QRect rect(centerX - 40, centerY - 20, 80, 40);painter.drawEllipse(rect);} else if ("多边形" == m_type) {QPoint point[10];point[0] = QPoint(centerX - 60, centerY);point[1] = QPoint(centerX - 20, centerY);point[2] = QPoint(centerX, centerY - 40);point[3] = QPoint(centerX + 20, centerY);point[4] = QPoint(centerX + 60, centerY);point[5] = QPoint(centerX + 20, centerY + 20);point[6] = QPoint(centerX + 50, centerY + 50);point[7] = QPoint(centerX, centerY + 20);point[8] = QPoint(centerX - 50, centerY + 50);point[9] = QPoint(centerX - 20, centerY + 20);painter.drawPolygon(point, 10);} else if ("扇形" == m_type) {// 通过矩形来绘制的// 3点钟的方向为 0 度,顺时针方向为负值,逆时针方向为正值, 360度 = 5760份,1度为16份QRect rect(centerX - 20, centerY - 20, 40, 40);int startAngle = 0;  //起始角度int spanAngle = 90 * 16;  //终点角度 - 起始角度,正值:逆时针方向painter.drawPie(rect, startAngle, spanAngle);} else if ("弧形" == m_type) {// 通过矩形来绘制的// 3点钟的方向为 0 度,顺时针方向为负值,逆时针方向为正值, 360度 = 5760份,1度为16份QRect rect(centerX - 20, centerY - 20, 40, 40);int startAngle = 0;  //起始角度int spanAngle = 90 * 16;  //终点角度 - 起始角度,正值:逆时针方向painter.drawArc(rect, startAngle, spanAngle);} else if ("弦" == m_type) {// 通过矩形来绘制的// 3点钟的方向为 0 度,顺时针方向为负值,逆时针方向为正值, 360度 = 5760份,1度为16份QRect rect(centerX - 20, centerY - 20, 40, 40);int startAngle = 0;  //起始角度int spanAngle = 90 * 16;  //终点角度 - 起始角度,正值:逆时针方向painter.drawChord(rect, startAngle, spanAngle);} else if ("圆角矩形" == m_type) {QRect rect(centerX - 20, centerY - 20, 40, 40);painter.drawRoundedRect(rect, 5, 5);} else if ("路径" == m_type) {QPainterPath path;path.moveTo(centerX, centerY);path.lineTo(centerX, centerY - 40);path.cubicTo(centerX + 60, centerY - 60, centerX + 20, centerY - 20, centerX + 80, centerY +80);painter.drawPath(path);} else if ("文本" == m_type) {// 设置字体QFont font;font.setPixelSize(24);painter.drawText(centerX, centerY, "Sevenlin");} else if ("图片" == m_type) {QPixmap pix = QPixmap("./luffy0505.jpg");painter.drawPixmap(rect(), pix);} else if ("路飞" == m_type) {paintLuffy(painter);}
}
  • LQCanvas的使用
// .h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_comboBoxShapeType_currentIndexChanged(int index);private:Ui::Widget *ui;
};
#endif // WIDGET_H// .cpp
#include "widget.h"
#include "ui_widget.h"
#include "lqcanvas.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setWindowTitle("Sevenlin_QPainter练习小记");QStringList type{"路飞", "点", "线", "三角形", "正方形", "长方形", "圆形", "椭圆形", "多边形", "扇形", "弧形", "弦", "圆角矩形", "路径", "文本", "图片"};ui->comboBoxShapeType->addItems(type);
}Widget::~Widget()
{delete ui;
}void Widget::on_comboBoxShapeType_currentIndexChanged(int index)
{Q_UNUSED(index)QString type = ui->comboBoxShapeType->currentText();ui->widgetCavans->setType(type);
}
  • 简单绘制草帽海贼旗一枚

【QT小记】使用QPainter绘制各种基本图形相关推荐

  1. QPainter绘制罗盘

    QPainter绘制罗盘 使用Qt中的QPainter绘制罗盘,根据实时航向信息改变,效果图如下(真的丑).QPainter官方文档地址: 新建Qt设计师界面类Compass: 官方文档中给出QPai ...

  2. QT基础之一文介绍QPainter绘制基础图形(画笔画刷设置,填充铺展渐变效果)

    更多参见 QT基础与实例应用目录 代码链接 GitHub链接 :QPainterSimpleExample 介绍 结合实例介绍如何利用QPainter绘制各种图形,可绘制不同形状,使用不同画笔颜色.画 ...

  3. PyQt5利用QPainter绘制各种图形

    这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...

  4. 【Qt】2D绘图之绘制简单的图形

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...

  5. java画布制作弧形文字_QT 使用QPainter 绘制图形 和 世界变换 world transform

    1. 绘制椭圆  饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可. void Widget::paintEvent(QPaintEve ...

  6. 继承QWidget使用QPainter自定义二维图形控件【Qt学习】

    继承QWidget使用QPainter自定义二维图形控件[Qt学习] 通过阅读该文章,将了解本文所说的二维图形控件的基本概念.为何要自定义二维图形控件.如何自定义二维图形控件. 该文章将首先进行一些书 ...

  7. Qt使用QPainter绘制方式显示图片

    Qt使用QPainter绘制方式显示图片 文章目录 Qt使用QPainter绘制方式显示图片 1.前言 2.主要代码 3.实现效果 4.源代码 更多精彩内容

  8. QT学习之QPainter

    关于painter绘图 QImage是绘图设备,而QPainter则是画笔,painter(&image)的意思是将图绘制在image上进行显示. image = QImage(w, h, Q ...

  9. QT学习:QPainter与QPainterPath

    一.QPainter 利用QPainter绘制图形,QPainter类中包含了丰富的绘制图形的函数,常用的有以下几种. (1)QPainter::drawLine():绘制直线 (2)QPainter ...

  10. QPainter绘制自定义大小的图片

    QPainter绘制图片使用drawPixmap接口,qt提供了两种绘制方式,接口如下: 1.第一种,传入绘制点位,即为图片左上角定位点,图片有多大就绘制多大,若需要修改图片大小,可采用QPixmap ...

最新文章

  1. 重定向程序无法决定链接类型 解决方案
  2. 《代码整洁之道》(Clean Code)- 读书笔记
  3. javascript—闭包
  4. Android --- 解决 cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037: 由于目标计算机积极拒绝,无
  5. 实用的 GitHub 仓库搜索技巧
  6. Eclipse 中切换不同的JDK设置
  7. (BFS)Prime Path (poj3126)
  8. 在MVC 6 .NET核心应用程序中添加种子数据
  9. Java-编程规范与代码风格
  10. python内存分配失败_关于python:如何避免[Errno 12]无法分配使用子进程模块导致的内存错误...
  11. leetcode—25.链表排序题目leetcode总结
  12. 【码学堂】教师如何在码学堂上组织教学活动?
  13. 点云边界提取方法总结
  14. java阴历阳历_Java 阴历阳历转换
  15. 北京外国语大学计算机考研,北京外国语大学考研难吗?一般要什么水平才可以进入?...
  16. Linux-DNS学习记录01-安装部署
  17. QT程序退出后托盘图标不消失问题
  18. 这5种计算机视觉技术,刷新你的世界观
  19. 欧拉系统安装与部署NextCloud与常见部署问题解决以及数据盘迁移
  20. numpy矩阵删除一列或一行

热门文章

  1. HEU KMS ActivatorV7.8.6迷你版 激活工具使用
  2. 神通广大、卓有奇效的“mini-KMS_Activator_v1.051”(迷你KMS)初现江湖
  3. 哔哩哔哩H.265编码器在直播和点播的实践和应用
  4. python socket实现浏览器访问本地文件资源即静态网页(TCP)
  5. DIY LDAC蓝牙接收器(二)硬件调试篇
  6. 计算机更新好不,系统更新好还是系统不更新好?
  7. sop封装与dip封装的语音芯片有何区别?
  8. Logo设计技巧和方法
  9. 机器学习与深度学习视频讲解
  10. NLP学习笔记[1] -- 构建词向量模型 -- Word2Vec与词嵌入