一、概述

在自定义贝塞尔曲线中想绘制一个坐标轴。

二、步骤

2.1 新建一个类 PaintAxis 继承 QWidget

然后在界面上拖拽一个 widget,右键 widget 提升为 PaintAxis 。

2.2 重写 paintEvent 函数

  1. 绘制 x,y 轴线
  2. 绘制坐标刻度
  3. 绘制坐标值

三、代码

3.1 .h 文件

#ifndef PAINTAXIS_H
#define PAINTAXIS_H#include <QWidget>
#include <QPainter>
#include <QDebug>// @class 绘制坐标轴
// ----------------------------
class PaintAxis: public QWidget
{public:PaintAxis(QWidget *parent);virtual void paintEvent(QPaintEvent *event);/// @brief 设置为数学坐标系void SetMathCoordinate(QPainter* painter);/// @brief 恢复默认坐标系void ResetDefaultCoordinate(QPainter* painter);/// @brief 绘制坐标刻度void PaintCoordinateCalibration(QPainter* painter);/// @brief 绘制坐标值void PaintCoordinateValue(QPainter* painter);/// @brief 绘制两条坐标轴直线void PaintCoordinateAxis(QPainter* painter);private:QPoint m_ptStartPos; // 起始点int m_axisWidth;    // 坐标轴的宽度int m_axisHeight;   // 坐标轴的高度
};#endif // PAINTAXIS_H

3.2 cpp 文件

#include "paintaxis.h"const int GRAPH_SCALE = 2;                // 图的放大倍数
const int COORDINATE_CALIBRATION_LENGTH = 4;    // 坐标刻度的长度// ----------------------------------------------------
PaintAxis::PaintAxis(QWidget *parent) : QWidget(parent)
{m_ptStartPos.setX(30);m_ptStartPos.setY(30);m_axisWidth = 256 * GRAPH_SCALE;m_axisHeight = 256 * GRAPH_SCALE;
}// -------------------------------------------------
void PaintAxis::SetMathCoordinate(QPainter* painter)
{/** @brief 转换为数学坐标系,原点在左下角*/painter->setWindow(0,height(),width(),-height());
}// ------------------------------------------------------
void PaintAxis::ResetDefaultCoordinate(QPainter* painter)
{/** @brief 恢复默认坐标系,原点在左上角*/painter->setWindow(0, 0, this->width(), this->height());
}// ---------------------------------------------------
void PaintAxis::PaintCoordinateAxis(QPainter* painter)
{/** @brief 绘制 x 轴,y轴*/QPen pen;pen.setColor(Qt::white);painter->setPen(pen);SetMathCoordinate(painter);QPoint axisStartPoint;QPoint axisXEndPoint; // x 轴终点QPoint axisYEndPoint; // y 轴终点axisStartPoint.setX(m_ptStartPos.x());axisStartPoint.setY(m_ptStartPos.y());axisXEndPoint.setX(m_ptStartPos.x() + m_axisWidth);axisXEndPoint.setY(m_ptStartPos.y());axisYEndPoint.setX(m_ptStartPos.x());axisYEndPoint.setY(m_ptStartPos.y() + m_axisHeight);painter->drawLine(axisStartPoint, axisXEndPoint);painter->drawLine(axisStartPoint, axisYEndPoint);
}// -----------------------------------------------------------
void PaintAxis::PaintCoordinateCalibration(QPainter* painter)
{/** @brief 绘制坐标刻度*/int deltaX = m_axisWidth / 16;  // X 轴坐标刻度宽度int deltaY = m_axisHeight / 16; // Y 轴坐标刻度宽度for (int i = m_ptStartPos.x(); i < m_axisWidth + m_ptStartPos.x(); ){// 横坐标位置每次递增i = i + deltaX;// 坐标刻度起始点QPoint calibrationStartPoint;calibrationStartPoint.setX(i);calibrationStartPoint.setY(m_ptStartPos.y());// 坐标刻度结束点QPoint calibrationEndPoint;calibrationEndPoint.setX(i);calibrationEndPoint.setY(m_ptStartPos.y() - COORDINATE_CALIBRATION_LENGTH);painter->drawLine(calibrationStartPoint, calibrationEndPoint);}for (int i = m_ptStartPos.y() + deltaY; i <= m_axisHeight + m_ptStartPos.y(); i = i + deltaY){// 坐标刻度起始点QPoint calibrationStartPoint;calibrationStartPoint.setX(m_ptStartPos.x()); // x 轴不变,y 轴变calibrationStartPoint.setY(i);// 坐标刻度结束点QPoint calibrationEndPoint;calibrationEndPoint.setX(m_ptStartPos.x() - COORDINATE_CALIBRATION_LENGTH);calibrationEndPoint.setY(i);painter->drawLine(calibrationStartPoint, calibrationEndPoint);}
}// ----------------------------------------------------
void PaintAxis::PaintCoordinateValue(QPainter* painter)
{/** @brief 绘制坐标值*/int axisXValue = 0;int axisYValue = 0;int deltaX = m_axisWidth / 16;  // X 轴坐标刻度宽度int deltaY = m_axisHeight / 16; // Y 轴坐标刻度宽度ResetDefaultCoordinate(painter); // 必须恢复原来的坐标系,不然文字会镜像for (int i = m_ptStartPos.x(); i <= m_axisWidth + m_ptStartPos.x(); ){i = i + deltaX;QString strAxisXValue = QString::number(axisXValue);QPoint temp;temp.setX(i - m_ptStartPos.x() - 10); // 左边移动的偏移量temp.setY(height() + 18 - m_ptStartPos.y());painter->drawText(temp, strAxisXValue);axisXValue = axisXValue + 16;}for (int i = 0; i <= m_axisHeight; i = i + deltaY){QString strAxisYValue = QString::number(axisYValue);QPoint temp;temp.setX(m_ptStartPos.x() - 23);         // 左边移动的偏移量temp.setY(height() - m_ptStartPos.y() - i + 3);painter->drawText(temp, strAxisYValue);axisYValue = axisYValue + 16;}
}// -------------------------------------------
void PaintAxis::paintEvent(QPaintEvent *event)
{QPainter painter(this);// 绘制坐标轴两条直线PaintCoordinateAxis(&painter);// 绘制坐标刻度PaintCoordinateCalibration(&painter);// 绘制坐标值PaintCoordinateValue(&painter);
}

四、结果

Qt 通过 QPainter 绘制坐标轴相关推荐

  1. pyqt5使用QPainter绘制坐标轴并显示散点图

    pyqt5使用QPainter绘制坐标轴并显示散点图 1.效果图 2.代码 from PyQt5.Qt import * import sys, randomclass DrawPoints(QWid ...

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

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

  3. QT 中QPainter绘制文字、图片

    1. 把字符串绘制在QPixmap上 QPixmap MainWindow::text2Pixmap(QString text) { QFontMetrics fmt(m_font); QPixmap ...

  4. 使用Qt的QPainter绘制阿基米德螺旋线

    把笔记 c++绘制极坐标曲线 的代码中的allegro换成Qt的了. 因为自定义的QWidget写在源文件中所以Q_OBJECT注释掉了. #include <QApplication> ...

  5. qt用QPainter绘制会动会闪烁的奥运标志

    效果视频地址: https://www.bilibili.com/video/av85608043/ 源码: mainwindow.h #ifndef MAINWINDOW_H #define MAI ...

  6. QT之QPainter用法

    QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状.它也可以绘制排列的文本和像素映射.通常,它在一个"自然的"坐标系统中绘制. QPainter 一般在部件的绘图事件 ...

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

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

  8. VS+QT QPainter 绘制直线

    1.打开软件,创建一个GUI项目文件. 2.编写.h(Draw2.h)文件代码,如下: #pragma once#include <QtWidgets/QMainWindow> #incl ...

  9. qt连接mysql绘制曲线图表_Qt绘制曲线

    Qt绘制曲线 引言 应易和仓储系统需求,使运输车在行驶过程与刹车过程中运行得平稳,下位机通过无极变速控制应运而生,而上位机的无极变速参数设置也必不可少.这就用到了Qt的绘制曲线. Qt的图形界面很厉害 ...

最新文章

  1. Linux EOF使用
  2. 《几何与代数导引》例2.6
  3. PyTorch 训练可视化教程 visdom
  4. Android华容道之一步一步实现-序言
  5. java oracle数据备份_Java备份还原Oracle数据库
  6. [ lucene FAQ ] 当磁盘索引被IndexSearcher打开时,为什么优化操作后索引容量翻倍?...
  7. HTML 上标题栏把右标题栏遮挡,如何编辑组件的样式(编辑样式)?
  8. 内核kconfig语法及原理
  9. 做开发很久了 Remoting 一直没有碰过,正好最近的项目上面用,就拿出来给大家看看
  10. EOS开发DApp 创建EOS钱包和账号
  11. 51单片机外设篇:DS18B20
  12. Unity学习笔记–无限地图
  13. Oracle 如何定义自动增量autocreament的主键ID?
  14. 你程序员,996这就是你的命
  15. 解决eclipse桌面快捷方式打不开的问题
  16. 章文嵩:开源,LVS,以及留下的无数传说
  17. 光学瞄准镜测距之数学原理
  18. gophish配合邮件服务器,【CS】Cobalt Strike发送钓鱼邮件
  19. Pikachu靶场全关攻略(超详细!)
  20. 灰色关联度矩阵模型及其MATLAB实现

热门文章

  1. ESIM模型详细解读
  2. XSS-11注入靶场闯关(小游戏)——第十一关
  3. 聊聊ip与mac地址之间那些事
  4. android 刷机后存储空间变小,安卓手机内存越来越小的解决办法
  5. s7五杀大数据英雄_S7全球总决赛,只有两个英雄拿过五杀!下一个将会是谁?...
  6. CSS网页页面图像灰色滤镜写法示例
  7. 两阶段提交协议(two phase commit protocol,2PC)详解
  8. 《计算之魂》读书笔记 01
  9. [C in ASM(ARM64)]第一章 一些实例
  10. gta python解指纹_python爬虫JS逆向:X咕视频密码与指纹加密分析