通过QChart绘制折线图
ui:
主窗口类定义和初始化
构造函数
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QChart *chart; //当前的图表
QLineSeries *curSeries; //当前序列
QValueAxis *curAxis; //当前坐标轴
void createChart(); //创建图表
void prepareData(); //更新数据
void updateFromChart(); //从图表更新到界面
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
MainWindow 类中定义了 3 个函数,其中函数 createChart()用于创建图表,在构造函数里被调用;函数 prepareData()用于更新序列的数据;函数 updateFromChart()用于读取图表的一些属性,并刷新界面显示内容。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
createChart(); //创建图表
prepareData(); //为序列生成数据
updateFromChart(); //从图表获取属性值,刷新界面显示内容
this->setCentralWidget(ui->splitter);
}
createChart()
void MainWindow::createChart()
{//创建图表
chart = new QChart();
chart->setTitle(tr("简单函数曲线"));
ui->chartView->setChart(chart);
ui->chartView->setRenderHint(QPainter::Antialiasing);
QLineSeries *series0 = new QLineSeries();
QLineSeries *series1 = new QLineSeries();
series0->setName("Sin 曲线");
series1->setName("Cos 曲线");
curSeries=series0; //当前序列
QPen pen;
pen.setStyle(Qt::DotLine);
pen.setWidth(2);
pen.setColor(Qt::red);
series0->setPen(pen); //序列 series0 的线条设置
pen.setStyle(Qt::SolidLine);
pen.setColor(Qt::blue);
series1->setPen(pen); //序列 series1 的线条设置
chart->addSeries(series0); //将序列添加到图表中
chart->addSeries(series1);
QValueAxis *axisX = new QValueAxis;
curAxis=axisX; //当前坐标轴
axisX->setRange(0, 10);
axisX->setLabelFormat("%.1f"); //标签格式
axisX->setTickCount(11); //主刻度个数
axisX->setMinorTickCount(2); //次刻度个数
axisX->setTitleText("time(secs)"); //轴标题
QValueAxis *axisY = new QValueAxis;
axisY->setRange(-2, 2);
axisY->setLabelFormat("%.2f"); //标签格式
axisY->setTickCount(5);
axisY->setMinorTickCount(2);
axisY->setTitleText("value");
//为 chart 和序列设置坐标轴
chart->addAxis(axisX,Qt::AlignBottom); //将坐标轴添加到图表中,并指定方向
chart->addAxis(axisY,Qt::AlignLeft);
series0->attachAxis(axisX); //序列 series0,附加坐标轴
series0->attachAxis(axisY);
series1->attachAxis(axisX); //序列 series1,附加坐标轴
series1->attachAxis(axisY);
}
prepareData()
void MainWindow::prepareData()
{//为序列生成数据
QLineSeries *series0= static_cast<QLineSeries *>(chart->series().at(0));
QLineSeries *series1= static_cast<QLineSeries *>(chart->series().at(1));
series0->clear(); //清除数据
series1->clear();
qreal t=0, y1, y2, intv=0.1;
int cnt= 100;
for(int i=0; i<cnt; i++)
{
int rd= QRandomGenerator::global()->bounded(-5,6); //随机整数,[-5,5]
y1= qSin(t)+rd/50.0;
series0->append(t,y1); //序列添加数据点
rd= QRandomGenerator::global()->bounded(-5,6); //随机整数,[-5,5]
y2= qCos(t)+rd/50.0;
series1->append(t,y2); //序列添加数据点
t += intv;
}
}
updateFromChart()
void MainWindow::updateFromChart()
{
QChart *curChart= ui->chartView->chart(); //获取视图组件关联的 chart
ui->editTitle->setText(curChart->title()); //图表标题
QMargins mg= curChart->margins(); //图表的边距
ui->spinMarginLeft->setValue(mg.left());
ui->spinMarginRight->setValue(mg.right());
ui->spinMarginTop->setValue(mg.top());
ui->spinMarginBottom->setValue(mg.bottom());
}