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

运行截图:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值