概述
折线图 | 样条曲线 | 面积 | 散点 | 条形 |
---|---|---|---|---|
饼图 | 方块胡须图 | 蜡烛图 | 极坐标图 |
折线图
//QT += charts
#include <QtCharts> //必须这么设置
QT_CHARTS_USE_NAMESPACE//使用宏定义 或using namespace QtCharts
//创建图表
QChartView *chartView=new QChartView(this); //创建 ChartView
QChart *chart = new QChart(); //创建 Chart
chart->setTitle("简单函数曲线");
chartView->setChart(chart); //Chart添加到ChartView
this->setCentralWidget(chartView);
//创建曲线序列
QLineSeries *series0 = new QLineSeries();
series0->setName("Sin曲线");
chart->addSeries(series0); //序列添加到图表
//序列添加数值
qreal t=0,y1,y2,intv=0.1;
int cnt=100;
for(int i=0;i<cnt;i++)
{
y1=qSin(t);//+qrand();
series0->append(t,y1);
t+=intv;
}
//创建坐标轴
QValueAxis *axisX = new QValueAxis; //X 轴
axisX->setRange(0, 10); //设置坐标轴范围
axisX->setTitleText("time(secs)"); //标题
chart->setAxisX(axisX, series0); //为序列设置坐标轴
//QT += charts
#include <QtCharts> //必须这么设置
QT_CHARTS_USE_NAMESPACE//使用宏定义 或using namespace QtCharts
//创建图表
QChartView *chartView=new QChartView(this); //创建 ChartView
QChart *chart = new QChart(); //创建 Chart
chart->setTitle("简单函数曲线");
chartView->setChart(chart); //Chart添加到ChartView
this->setCentralWidget(chartView);
//创建曲线序列
QLineSeries *series0 = new QLineSeries();
series0->setName("Sin曲线");
chart->addSeries(series0); //序列添加到图表
//序列添加数值
qreal t=0,y1,y2,intv=0.1;
int cnt=100;
for(int i=0;i<cnt;i++)
{
y1=qSin(t);//+qrand();
series0->append(t,y1);
t+=intv;
}
//创建坐标轴
QValueAxis *axisX = new QValueAxis; //X 轴
axisX->setRange(0, 10); //设置坐标轴范围
axisX->setTitleText("time(secs)"); //标题
chart->setAxisX(axisX, series0); //为序列设置坐标轴
//案例
ui->btnColor->setAutoFillBackground(true); //设置颜色按钮的背景色
QString str=QString::asprintf("background-color: rgb(%d, %d, %d);", color.red(),color.green(),color.blue());
ui->btnColor->setStyleSheet(str);
chart->addAxis(axisX,Qt::AlignBottom); //坐标轴添加到图表,并指定方向
series0->attachAxis(axisX); //序列 series0 附加坐标轴
*series0<<QPointF(t,y1); //序列添加数据点
QMargins mg=aChart->margins(); //边距
mgs.setLeft(ui->spinMarginLeft->value());
ui->chartView->chart()->setMargins(mgs);
//坐标轴设置
QValueAxis *axisX = new QValueAxis;
axisX->setRange(0, 10); //设置坐标轴范围
axisX->setLabelFormat("%.1f"); //标签格式
axisX->setTickCount(11); //主分隔个数(坐标要有几个数)
axisX->setMinorTickCount(4);//每个小格子中有几个刻度,次分隔个数
//序列的数据点是否可见
curSeries->setPointsVisible(checked);
//序列的数据点标签是否可见
curSeries->setPointLabelsVisible(checked);
//图例是否可见
ui->chartView->chart()->legend()->setVisible(checked);
//获取坐标轴
QAbstractAxis* axes=ui->chartView->chart()->axes(Qt::Horizontal);
//轴的网格线是否可见
curAxis->setGridLineVisible(checked);
//次级刻度是否可见
curAxis->setMinorGridLineVisible(checked);
//图例的背景是否可见
ui->chartView->chart()->legend()->setBackgroundVisible(checked);
//图例的位置
ui->chartView->chart()->legend()->setAlignment(Qt::AlignTop);
//设置坐标轴刻度标签的文字格式
curAxis->setLabelFormat(ui->editAxisLabelFormat->text());
//网格线的颜色设置
QColor color=curAxis->gridLineColor();
curAxis->setGridLineColor(color);
//次级刻度网格线颜色
QColor color=curAxis->minorGridLineColor();
curAxis->setMinorGridLineColor(color);
//序列的透明度
curSeries->setOpacity(value/10.0);
//序列数据点标签颜色
QColor color=curSeries->pointLabelsColor();
curSeries->setPointLabelsColor(color);
//序列数据点标签的显示格式
curSeries->setPointLabelsFormat("@yPoint");
curSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
//动画效果
ui->chartView->chart()->setAnimationOptions(QChart::AnimationOptions(index));
//图表的主题
ui->chartView->chart()->setTheme(QChart::ChartTheme(index));
//放大
ui->chartView->chart()->zoom(1.2);//zoomIn();
其他常见图
//创建柱状图
QChart *chart =ui->chartViewBar->chart(); //获取ChartView关联的chart
//创建三个QBarSet数据集,从数据模型的表头获取Name
QBarSet *setMath = new QBarSet(theModel->horizontalHeaderItem(colNoMath)->text());
QBarSet *setChinese = new QBarSet(theModel->horizontalHeaderItem(colNoChinese)->text());
QBarSet *setEnglish= new QBarSet(theModel->horizontalHeaderItem(colNoEnglish)->text());
QLineSeries *Line = new QLineSeries(); //创建一个QLineSeries序列用于显示平均分
//创建一个柱状图序列 QBarSeries, 并添加三个数据集
QBarSeries *series = new QBarSeries();
series->append(setMath);
series->append(setChinese);
series->append(setEnglish);
chart->addSeries(series); //添加柱状图序列
chart->addSeries(Line); //添加折线图序列
//用于横坐标在字符串列表,即学生姓名
QStringList categories;
for (int i=0;i<theModel->rowCount();i++)
categories <<theModel->item(i,colNoName)->text();
//用于柱状图的坐标轴
QBarCategoryAxis *axisX = new QBarCategoryAxis();
axisX->append(categories); //添加横坐标文字列表
chart->setAxisX(axisX, series); //设置横坐标
chart->setAxisX(axisX, Line);//设置横坐标
axisX->setRange(categories.at(0), categories.at(categories.count()-1)); //这只坐标轴范围
//数值型坐标作为纵轴
QValueAxis *axisY = new QValueAxis;
axisY->setRange(0, 100);
axisY->setTitleText("分数");
axisY->setTickCount(6);//11
axisY->setLabelFormat("%.0f"); //标签格式
chart->setAxisY(axisY, series);
chart->setAxisY(axisY, Line);
//叠加柱状图
QStackedBarSeries *series = new QStackedBarSeries();
//其余和柱状图相同
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mIVhUiH-1643874436171)(https://gitee.com/big-gift/my-pic/raw/master/Qt/image-20220118143511306.png)]
//绘制百分比柱状图
QPercentBarSeries *series = new QPercentBarSeries(); //序列
//绘制饼图
QChart *chart =ui->chartViewPie->chart(); //获取chart对象
QPieSeries *series = new QPieSeries(); //创建饼图序列
series->setHoleSize(ui->spinHoleSize->value()); //饼图中间空心的大小
series->setPieSize(ui->spinPieSize->value());
QPieSlice *slice; //饼图分块
for(int i=0;i<=4;i++) //设置每个分块的标签文字
{
slice =series->slices().at(i); //获取分块
slice->setLabel(slice->label()+QString::asprintf(": %.0f人, %.1f%%", //设置分块的标签
slice->value(),slice->percentage()*100));
//信号与槽函数关联,鼠标落在某个分块上时,此分块弹出
connect(slice, SIGNAL(hovered(bool)),
this, SLOT(on_PieSliceHighlight(bool)));
}
slice->setExploded(true); //最后一个设置为exploded
series->setLabelsVisible(true); //只影响当前的slices,必须添加完slice之后再设置
chart->addSeries(series); //添加饼图序列
chart->setTitle("Piechart----"+ui->cBoxCourse->currentText());
chart->legend()->setVisible(true); //图例
chart->legend()->setAlignment(Qt::AlignRight);//Qt::AlignRight
void MainWindow::on_PieSliceHighlight(bool show)
{ //鼠标移入、移出时触发hovered()信号,动态设置setExploded()效果
QPieSlice *slice;
slice=(QPieSlice *)sender();
slice->setExploded(show);
}
chart()->setTheme(QChart::ChartTheme(index));//更改主体
//绘制 QScatterSeries和QSplineSeries图
QSplineSeries *seriesLine = new QSplineSeries(); //光滑曲线序列
QScatterSeries *series0 = new QScatterSeries(); //散点序列
series0->setMarkerShape(QScatterSeries::MarkerShapeCircle);
chart->addSeries(series0);
chart->addSeries(seriesLine);
chart->createDefaultAxes(); //创建缺省的坐标轴
图表的其他操作
//自定义的QWChartView.h
#include <QtCharts> //必须这么设置
QT_CHARTS_USE_NAMESPACE //必须这么设置
class QWChartView : public QChartView
{
Q_OBJECT
private:
QPoint beginPoint; //选择矩形区的起点
QPoint endPoint; //选择矩形区的终点
protected:
void mousePressEvent(QMouseEvent *event); //鼠标左键按下
void mouseMoveEvent(QMouseEvent *event); //鼠标移动
void mouseReleaseEvent(QMouseEvent *event); //鼠标释放左键
void keyPressEvent(QKeyEvent *event); //按键事件
public:
explicit QWChartView(QWidget *parent = 0);
~QWChartView();
signals:
void mouseMovePoint(QPoint point); //鼠标移动信号,在mouseMoveEvent()事件中触发
};
//自定义的QWChartView.cpp
#include "qwchartview.h"
#include <QChartView>
void QWChartView::mousePressEvent(QMouseEvent *event)
{//鼠标左键按下,记录beginPoint
if (event->button()==Qt::LeftButton)
beginPoint=event->pos();
QChartView::mousePressEvent(event);
}
void QWChartView::mouseMoveEvent(QMouseEvent *event)
{//鼠标移动事件
QPoint point;
point=event->pos();
emit mouseMovePoint(point);
QChartView::mouseMoveEvent(event);
}
void QWChartView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button()==Qt::LeftButton)
{ //鼠标左键释放,获取矩形框的endPoint,进行缩放
endPoint=event->pos();
QRectF rectF;
rectF.setTopLeft(this->beginPoint);
rectF.setBottomRight(this->endPoint);
this->chart()->zoomIn(rectF);
}
else if (event->button()==Qt::RightButton)
this->chart()->zoomReset(); //鼠标右键释放,resetZoom
QChartView::mouseReleaseEvent(event);
}
void QWChartView::keyPressEvent(QKeyEvent *event)
{//按键控制
switch (event->key()) {
case Qt::Key_Plus: //+
chart()->zoom(1.2);
break;
case Qt::Key_Minus:
chart()->zoom(0.8);
break;
case Qt::Key_Left:
chart()->scroll(10, 0);
break;
case Qt::Key_Right:
chart()->scroll(-10, 0);
break;
case Qt::Key_Up:
chart()->scroll(0, -10);
break;
case Qt::Key_Down:
chart()->scroll(0, 10);
break;
case Qt::Key_PageUp:
chart()->scroll(0, 50);
break;
case Qt::Key_PageDown:
chart()->scroll(0, -50);
break;
case Qt::Key_Home:
chart()->zoomReset();
break;
default:
QGraphicsView::keyPressEvent(event);
}
}
QWChartView::QWChartView(QWidget *parent):QChartView(parent)
{
this->setDragMode(QGraphicsView::RubberBandDrag);
this->setMouseTracking(true);//必须开启此功能
}
void MainWindow::on_LegendMarkerClicked()
{//点击图例的marker的响应
QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender());
switch (marker->type()) //marker的类型
{
case QLegendMarker::LegendMarkerTypeXY: //QLineSeries序列的图例marker
{
marker->series()->setVisible(!marker->series()->isVisible()); //可见性
marker->setVisible(true);
qreal alpha = 1.0;
if (!marker->series()->isVisible())
alpha = 0.5;
QColor color;
QBrush brush = marker->labelBrush();
color = brush.color();
color.setAlphaF(alpha);
brush.setColor(color);
marker->setLabelBrush(brush);
brush = marker->brush();
color = brush.color();
color.setAlphaF(alpha);
brush.setColor(color);
marker->setBrush(brush);
QPen pen = marker->pen();
color = pen.color();
color.setAlphaF(alpha);
pen.setColor(color);
marker->setPen(pen);
break;
}
default:
break;
}
}
//鼠标移动响应
QPointF pt=ui->chartView->chart()->mapToValue(point); //转换为图表的数值
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。
在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。
本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。
除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。
在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!