Qt画五角星,简单图表

五角星:

代码:

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPaintEvent>
#include <QPainter>
#include <QPainterPath>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("Draw Five-Pointed Star");
    //setFixedSize(300, 300);
    setPalette(Qt::red);
    update();
}

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

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    //启用抗锯齿渲染,这可以让绘制的图形看起来更加平滑,减少锯齿状的边缘
    painter.setRenderHint(QPainter::Antialiasing);
    //启用文字的抗锯齿渲染,这可以让绘制的文字更加清晰,减少锯齿状的边缘。
    painter.setRenderHint(QPainter::TextAntialiasing);
    qreal R=100;
    const qreal Pi=3.14159;
    //将 72 度这个角度转换成弧度制的值,并存储在 deg 变量中
    qreal deg=Pi*72/180;
    //五角星的中点为原点,QPoint(R,0)是第一个点
    QPoint points[5]={
    QPoint(R,0),
    //根据qCos(deg)和qSin(deg)算出在坐标轴的位置,"-"表示Y轴向下(表示方向)
    QPoint(R*qCos(deg),-R*qSin(deg)),
    QPoint(R*qCos(2*deg),-R*qSin(2*deg)),
    QPoint(R*qCos(3*deg),-R*qSin(3*deg)),
    QPoint(R*qCos(4*deg),-R*qSin(4*deg))
    };

    //设置字体
    QFont font;
    font.setPointSize(14);
    painter.setFont(font);

    //设置画笔
    QPen penLine;
    //设置画笔的线宽为 2 个像素。
    penLine.setWidth(2);
    //设置画笔的颜色为蓝色。
    penLine.setColor(Qt::blue);
    //设置画笔的线条样式为实线。
    penLine.setStyle(Qt::SolidLine);
    //设置线条端点的样式为平头,除了平头,还有圆头和方头等样式可选。
    penLine.setCapStyle(Qt::FlatCap);
    painter.setPen(penLine);

    //设置画刷
    QBrush brush;
    brush.setColor(Qt::yellow);
    //设置画刷的填充样式为实心
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);
    //创建了一个 QPainterPath 对象,用于描述五角星的绘制路径
    QPainterPath starPath;
    //将绘制路径的起点移动到 points[0] 这个坐标。
    starPath.moveTo(points[0]);
    //从当前位置(points[0])绘制一条直线到 points[2] 这个坐标。
    starPath.lineTo(points[2]);
    starPath.lineTo(points[4]);
    starPath.lineTo(points[1]);
    starPath.lineTo(points[3]);
    starPath.closeSubpath();
    //在五角星的每个顶点处,添加了一个文字标签。
    starPath.addText(points[0],font,"1");
    starPath.addText(points[1],font,"2");
    starPath.addText(points[2],font,"3");
    starPath.addText(points[3],font,"4");
    starPath.addText(points[4],font,"5");

    //绘制第一个五角星
    painter.save();
    //将坐标系原点移动到 (100, 120) 这个位置。
    painter.translate(100,120);
    //使用之前定义的 starPath 绘制五角星图形。
    painter.drawPath(starPath);
    //在五角星的中心位置(0, 0)绘制文本标签 "s1"。
    painter.drawText(0,0,"s1");
    //恢复 QPainter 对象之前保存的状态,这样就不会影响后续的绘图操作。
    painter.restore();

    //绘制第二个五角星
    painter.translate(300,120);
    //对坐标系进行缩放,缩放比例为 0.8 x 0.8,这样绘制出来的五角星会比之前的小 20%。
    painter.scale(0.8,0.8);
    //对坐标系进行旋转,旋转角度为 90 度。
    painter.rotate(90);
    painter.drawPath(starPath);
    //在第二个五角星的中心位置(0, 0)绘制文本标签 "s2"
    painter.drawText(0,0,"s2");

    //绘制第三个五角星
    //将 QPainter 对象的变换矩阵重置为单位矩阵,这样可以清除之前的位移、缩放和旋转操作,回到初始状态。
    painter.resetTransform();
    painter.translate(500,120);
    painter.rotate(-145);
    painter.drawPath(starPath);
    painter.drawText(0,0,"s3");
    /*在Qt中,当一个事件发生时,比如鼠标点击或键盘输入,Qt会将这些事件传递给相应的窗口部件进行处理。
     * 处理完事件后,窗口部件可以决定是否接受这个事件,或者将其传递给父部件继续处理。
    event->accept(); 这行代码表示当前窗口部件已经处理完该事件,不需要再传递给父部件处理。
    这样可以防止事件被多个部件重复处理,提高程序的处理效率。*/
    event->accept();
}

运行截图:

简单图标表:

widget.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCharts>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QChartView *chartView=new QChartView(this);
    QChart *chart=new QChart();
    chart->setTitle("简单函数曲线");
    chartView->setChart(chart);
    this->setCentralWidget(chartView);
    //序列
    QLineSeries *series0=new QLineSeries();
    QLineSeries *series1=new QLineSeries();
    series0->setName("Sin曲线");
    series1->setName("Cos曲线");
    chart->addSeries(series0);
    chart->addSeries(series1);

    qreal t=0,y1,y2,intv=0.1;
    int cnt=100;
    for (int i = 0; i < cnt; ++i) {
        y1=qSin(t);
        series0->append(t,y1);
        y2=qCos(t);
        series1->append(t,y2);
        t+=intv;

    }
    //创建坐标轴
    QValueAxis *axisX=new QValueAxis();
    axisX->setRange(0,10);
    axisX->setTitleText("时间(秒)");
    QValueAxis *axisY=new QValueAxis();
    axisY->setRange(-2,2);
    axisY->setTitleText("数值");
    //坐标轴添加到图表和序列中
    chart->addAxis(axisX,Qt::AlignBottom);
    chart->addAxis(axisY,Qt::AlignLeft);
    series0->attachAxis(axisX);
    series0->attachAxis(axisY);
    series1->attachAxis(axisX);
    series1->attachAxis(axisY);
}

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

运行截图:

相关推荐
秃头佛爷38 分钟前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨39 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师4 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java6 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山6 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~6 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust