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;
}

运行截图:

相关推荐
喜欢的名字被抢了2 小时前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
从零开始的代码生活_4 小时前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端
wabs6664 小时前
关于单调栈【力扣739.每日温度的思考】
java·开发语言
AOwhisky4 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
逆向编程5 小时前
Socket异常连接自动清理方案
开发语言
va学弟6 小时前
Java 网络通信编程(10):Channel 和 Selector
java·开发语言
爱吃提升6 小时前
MATLAB impulse函数脉冲响应完整实操教程
开发语言·matlab
小饕7 小时前
从 1080 Ti 到树莓派 4:Qwen2.5-0.5B Function Calling 端侧部署七步实战
开发语言·人工智能
糯米导航7 小时前
Rust + ONNX Runtime 构建生产级 AI 推理服务:从零到压测
开发语言·人工智能·rust
阿pin7 小时前
Java随笔-ConcurrentHashMap
java·开发语言·哈希算法