效果图
准备工作
ui添加QGraphicsView,提升为QChartView,命名graphicsView。
接口和变量声明
QChart *chart;
QXYSeries *series1;
QXYSeries *series2;
QXYSeries *series3;
QXYSeries *series4;
QXYSeries *series5;
QXYSeries *series6;
void initChart();
QDateTimeAxis* ceateXAxis(QString name);
QValueAxis* ceateYAxis(QString name);
QXYSeries* ceateSeries(QString name, QColor color);
接口定义
void MainWindow::initChart()
{
chart = new QChart();
chart->setTheme(QChart::ChartThemeDark);
QDateTimeAxis *axisX = ceateXAxis("时间坐标系");
QValueAxis *axisYLeft = ceateYAxis("Y轴-左");
QValueAxis *axisYRight = ceateYAxis("Y轴-右");
series1 = ceateSeries("数据1", Qt::red);
series2 = ceateSeries("数据2", Qt::green);
series3 = ceateSeries("数据3", Qt::blue);
series4 = ceateSeries("数据4", Qt::darkRed);
series5 = ceateSeries("数据5", Qt::darkGreen);
series6 = ceateSeries("数据6", Qt::darkBlue);
chart->addSeries(series1);
chart->addSeries(series2);
chart->addSeries(series3);
chart->addSeries(series4);
chart->addSeries(series5);
chart->addSeries(series6);
axisYLeft->setMin(-30);
axisYLeft->setMax(30);
axisYRight->setMin(-20);
axisYRight->setMax(20);
axisYLeft->setTickCount(10);
axisYRight->setTickCount(10);
chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisYLeft, Qt::AlignLeft);
chart->addAxis(axisYRight, Qt::AlignRight);
series1->attachAxis(axisX);
series1->attachAxis(axisYLeft);
series2->attachAxis(axisX);
series2->attachAxis(axisYLeft);
series3->attachAxis(axisX);
series3->attachAxis(axisYLeft);
series4->attachAxis(axisX);
series4->attachAxis(axisYRight);
series5->attachAxis(axisX);
series5->attachAxis(axisYRight);
series6->attachAxis(axisX);
series6->attachAxis(axisYRight);
ui->graphicsView->setChart(chart);
ui->graphicsView->setRenderHint(QPainter::Antialiasing, true);//平滑曲线
ui->graphicsView->setRubberBand(QChartView::RectangleRubberBand);//缩放
}
QDateTimeAxis* MainWindow::ceateXAxis(QString name)
{
QDateTimeAxis *axisX = new QDateTimeAxis();
axisX->setTitleText(name);
axisX->setFormat("mm:ss");
axisX->setTickCount(10);
axisX->setLabelsAngle(-45);
return axisX;
}
QValueAxis* MainWindow::ceateYAxis(QString name)
{
QValueAxis *axisY = new QValueAxis();
axisY->setTitleText(name);
return axisY;
}
QXYSeries* MainWindow::ceateSeries(QString name, QColor color)
{
QSplineSeries *series = new QSplineSeries();
series->setName(name);
series->setColor(color);
return series;
}
测试代码
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initChart();
timer = new QTimer();
timer->setInterval(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(slotTimer()));
timer->start();
}
void MainWindow::slotTimer()
{
QDateTime time = QDateTime::currentDateTime();
QRandomGenerator rand(QTime(0,0,0).secsTo(QTime::currentTime()));
QList<QAbstractAxis*> axes = chart->axes(Qt::Horizontal);
axes[0]->setMin(QDateTime::currentDateTime().addSecs(-5*1));
axes[0]->setMax(QDateTime::currentDateTime().addSecs(0));
QXYSeries *series[] = {series1, series2, series3, series4, series5, series6};
for ( int i=0; i<=2; i++){
if(series[i]->count()>150) {
series[i]->removePoints(0, series[i]->count() - 150);
series[i+3]->removePoints(0, series[i+3]->count() - 150);
}
int Y1 = rand.generate() % 60 - 30;
int Y2 = Y1 - 10;
series[i]->append(time.toMSecsSinceEpoch(), Y1);
series[i+3]->append(time.toMSecsSinceEpoch(), Y2);
}
}