我的数据来源为tablewidget,下面是画图的源数据(6个学生的3科成绩)
第一步:新建项目,我的选择的是maindows,在pro里面添加如下代码
QT += charts
第二步:在ui界面里面拖拽Craphics View控件,然后右键选择提升 输入QChartView。
再次右键点击,显示这样代表提升使用成功。然后将控件名称改为graphicsView_scatter(可以不改)
第三步:添加头文件
#include <QtCharts>
第四步:编写代码
void MainWindow::buildScatterChart()
{
// 设置标题显示居中
QChart *chart = new QChart();
chart->setTitle("ScatterChart");
chart->setAnimationOptions(QChart::SeriesAnimations);
ui->graphicsView_scatter->setChart(chart);
ui->graphicsView_scatter->setRenderHint(QPainter::Antialiasing);
// 获取ChartView关联的chart
QChart *chart = ui->graphicsView_scatter->chart();
// 光滑曲线序列 QSplineSeries
QPen pen;
QString name = "学生";
QList<QColor> colors;
QVector<QSplineSeries *> seriesLines;
colors << Qt::blue << Qt::red << Qt::green << Qt::black << Qt::yellow << Qt::gray;
for (int i=0; i<6; i++) {
// 设置线条的名称、颜色、宽度,6个学生6条线
QSplineSeries *seriesLine = new QSplineSeries();
seriesLine->setName(name + QString::number(i + 1));
pen.setColor(colors[i]);
pen.setWidth(2 + i/5);
seriesLine->setPen(pen);
seriesLines << seriesLine;
}
// 散点序列
QScatterSeries *seriesScatter = new QScatterSeries();
seriesScatter->setName(u8"散点");
seriesScatter->setMarkerShape(QScatterSeries::MarkerShapeCircle);
seriesScatter->setBorderColor(Qt::black);
seriesScatter->setBrush(QBrush(Qt::gray));
seriesScatter->setMarkerSize(12);
// 从数据模型获得数据
int mathX ;
int chineseX;
int englishX;
for (int i=0; i<theModel->rowCount(); i++) {
// 拿到x轴坐标,数值型
mathX = theModel->item(i, colNoMath)->text().toInt();
chineseX = theModel->item(i, colNoChinese)->text().toInt();
englishX = theModel->item(i, colNoEnglish)->text().toInt();
// 科目种类为类型而不为数值型
// 散点图要求xy轴均为数值型,这里数学为1,语文为2,英语为3
seriesScatter->append(mathX, 1);
seriesScatter->append(chineseX, 2);
seriesScatter->append(englishX, 3);
seriesScatter->setMarkerSize(18); // 设置散点大小
// 以每一个学生为一条线
seriesLines[i]->append(mathX, 1);
seriesLines[i]->append(chineseX, 2);
seriesLines[i]->append(englishX, 3);
}
// addSeries添加序列 散点和线条
chart->addSeries(seriesScatter);
for (int i=0; i<6; i++) {
chart->addSeries(seriesLines[i]);
}
// 创建缺省的坐标轴,并设置范围
chart->createDefaultAxes();
chart->axisX()->setTitleText("x轴");
chart->axisX()->setRange(45, 100);
chart->axisY()->setTitleText("y轴");
chart->axisY()->setRange(0, 4);
// 显示图例 并且显示在右方
chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignRight);
}