改程序包括以下内容:
- 绘制极坐标图,图中绘制散点
- 实现按键+-缩放,按键上下左右旋转缩放
头文件内容如下,其中加粗部分为添加内容
#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);