《Qt开发》基于QPolarChart的极坐标图绘制

改程序包括以下内容:

  1. 绘制极坐标图,图中绘制散点
  2. 实现按键+-缩放,按键上下左右旋转缩放

头文件内容如下,其中加粗部分为添加内容

#ifndef POLARCHARTDEMO_H

#define POLARCHARTDEMO_H

#include <QtWidgets/QWidget>

#include "ui_polarchartdemo.h"

#include <QtCharts>

#include <qlayout.h>

class PolarChartDemo : public QWidget

{

    Q_OBJECT

public:

    PolarChartDemo(QWidget *parent = 0);

    ~PolarChartDemo();

private:

    Ui::PolarChartDemoClass ui;

    QChartView *chartView;

    QPolarChart *chart;

    void drawPolarChart();

    void keyPressEvent(QKeyEvent *event);

};

#endif // POLARCHARTDEMO_H

源文件内容如下

#include "polarchartdemo.h"

const qreal angularMin = 0;

const qreal angularMax = 360;

const qreal radialMin = 0;

const qreal radialMax = 100;

PolarChartDemo::PolarChartDemo(QWidget *parent)

    : QWidget(parent)

{

    ui.setupUi(this);

    ui.widget->setFocusPolicy(Qt::StrongFocus);//widget必须设置为Qt::StrongFocus

    drawPolarChart();

}

PolarChartDemo::~PolarChartDemo()

{

}

void PolarChartDemo::drawPolarChart()

{

    //准备QChartView对象显示chart

    chartView = new QChartView(ui.widget);

    chartView->setContentsMargins(0, 0, 0, 0);

    chartView->setRenderHint(QPainter::Antialiasing);

    chartView->setFocusPolicy(Qt::NoFocus);  //chartView必须设置为Qt::NoFocus

    //准备极坐标对象

    chart = new QPolarChart();

    chart->layout()->setContentsMargins(0, 0, 0, 0);

    chart->setMargins(QMargins(0, 0, 0, 0));

    chart->setTheme(QChart::ChartThemeBrownSand);

    chartView->setChart(chart);

    chart->setFocusPolicy(Qt::NoFocus);    //chart必须设置为Qt::NoFocus

    //准备散点序列

    QScatterSeries *series1 = new QScatterSeries();

    series1->setName("scatter");

    series1->setMarkerShape(QScatterSeries::MarkerShapeRectangle);  //散点样式只有圆圈和方块

    series1->setMarkerSize(8);

    series1->setColor(QColor(0,150,0));

    series1->setBorderColor(QColor(0,0,200));

    for (int i = angularMin; i <= angularMax; i += 20)

        series1->append(i, (i / radialMax) * 20.0);

    //将散点序列添加到chart对象

    chart->addSeries(series1);

    //准备坐标轴对象

    QValueAxis *angularAxis = new QValueAxis();

    angularAxis->setTickCount(9); // First and last ticks are co-located on 0/360 angle.

    angularAxis->setLabelFormat("%.1f");

    angularAxis->setShadesVisible(true);

    angularAxis->setShadesBrush(QBrush(QColor(249, 249, 255)));

    chart->addAxis(angularAxis, QPolarChart::PolarOrientationAngular);

    QValueAxis *radialAxis = new QValueAxis();

    radialAxis->setTickCount(5);

    radialAxis->setLabelFormat("%d");

    chart->addAxis(radialAxis, QPolarChart::PolarOrientationRadial);

    radialAxis->setRange(radialMin, radialMax);

    angularAxis->setRange(angularMin, angularMax);

    series1->attachAxis(radialAxis);

    series1->attachAxis(angularAxis);

    QHBoxLayout *hLayout = new QHBoxLayout(this);

    hLayout->setContentsMargins(0, 0, 0, 0);

    hLayout->addWidget(chartView);

    ui.widget->setLayout(hLayout);

}

//按键事件

void PolarChartDemo::keyPressEvent(QKeyEvent *event)

{

    switch (event->key()) {

    case Qt::Key_Plus:

        chart->zoomIn();

        break;

    case Qt::Key_Minus:

        chart->zoomOut();

        break;

    case Qt::Key_Left:

        chart->scroll(-1.0, 0);

        break;

    case Qt::Key_Right:

        chart->scroll(1.0, 0);

        break;

    case Qt::Key_Up:

        chart->scroll(0, 1.0);

        break;

    case Qt::Key_Down:

        chart->scroll(0, -1.0);

        break;

    }

}

特别提示:

开发过程遇到无法识别上下左右按键的问题,网上的回答五花八门,汇总在一起,终于把问题解决了。

1设置widget接收按键焦点的方式

 ui.widget->setFocusPolicy(Qt::StrongFocus);

2 设置其他子部件不接受按键焦点

chartView->setFocusPolicy(Qt::NoFocus);

chart->setFocusPolicy(Qt::NoFocus);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不相信眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值