心中有坐标 万物皆可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. 比杠精网友更可怕的,是懂王同事
  3. Elasticsearch索引(company)_Centos下CURL增删改
  4. video/audio在ios/android上播放兼容
  5. 【python进阶】_文件和目录操作
  6. 撤销操作 —— Git 学习笔记 12
  7. 【效率】一次打包,无限复用!教你用 PyCharm 搭建一劳永逸的开发环境
  8. linux jrdmm 命令 局部 编译,Cgminer-4.10.0 Linux 挖矿
  9. 华为p40 pro原理图_4188起 华为P40/Pro/Pro+国行发布 顶配8888 河图正式上线!
  10. java枚举的简单介绍
  11. stylus之选择器(Selectors)
  12. Tomcat 启动耗时严重
  13. python图像识别数字_使用python和tensorflow从Image中识别数字
  14. html字颜色代码,css 字体颜色(css color)
  15. Linux之shell命令
  16. 【视频编码】1080P、720P、4CIF、CIF所需要的理论带宽
  17. 基于高德api的地区全类poi爬取
  18. CodeForces - 1467C(枚举,思维)
  19. JS,统计图表大全--十一、甘特图
  20. Python爬虫-字体反爬-猫眼国内票房榜

热门文章

  1. 怎么用python画世界地图_python如何画出漂亮的地图?
  2. java工作流引擎:jbpm和activiti对比分析
  3. 谱曲软件-MuseScore
  4. 软件工程之软件质量管理
  5. 2019年最好的7个人工智能聊天机器人
  6. ricequant股东人数数据获取方式
  7. VMware搭建docker mastodon
  8. 亲历2010中国移动开发者大会
  9. 阿里云大学Linux学习路线图(学+测)重磅上线!
  10. coreldraw16开三折页_cdr怎么制作三折页?cdrX6制作三折页模板教程