Qt中QwtPlot界面,界面不断读取更新曲线,怎样以固定的时间范围显示位置,超过曲线随着刷新不断平移

Qt中QwtPlot界面,x轴为时间,y轴为位置,界面从函数接口不断读取时间和位置值来更新曲线,怎样以固定的时间范围显示位置,例如以20秒为范围,曲线只显示20秒,超过曲线随着刷新不断平移

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    要在Qt中使用QwtPlot界面库实现曲线的动态更新和显示范围的平移,可以按照以下步骤进行操作:

    1. 首先,在Qt中创建一个QwtPlot窗口部件,用于显示曲线图。可以使用Qt的设计师工具或通过代码手动创建窗口部件。

    2. 在代码中引入必要的QwtPlot和QwtPlotCurve头文件以及相关的Qt库文件。

    3. 创建一个QwtPlotCurve对象,用于绘制曲线。设置曲线的样式、颜色和宽度等属性。

    4. 使用QwtPlot的setAxisScale函数设置x轴和y轴的范围。根据需求,设置x轴的范围为最近的20秒的时间,y轴的范围根据数据的取值范围来设定。

    5. 创建一个定时器,定时从函数接口中获取最新的时间和位置值,并更新曲线数据。例如可以使用Qt的QTimer类。

    6. 在定时器的定时槽函数中,根据获取的最新数据更新曲线的数据点。可以使用QwtPointSeriesData对象来保存数据点。

    7. 调用QwtPlot的replot函数,重新绘制曲线图。

    8. 如果要实现曲线的平移效果,可以在定时槽函数中每次更新曲线数据后,根据最新的时间值调整x轴的范围。可以使用QwtPlot的setAxisScale函数来动态调整x轴的范围。

    下面是一个示例代码,演示了如何使用QwtPlot库实现曲线的动态更新和显示范围的平移:

    #include <QtWidgets/QMainWindow>
    #include <Qwt/QwtPlotCurve>
    #include <Qwt/QwtPlot>
    #include <Qwt/QwtPointSeriesData>
    #include <QTimer>
    
    class MainWindow : public QMainWindow {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
            // 创建QwtPlot窗口部件
            plot = new QwtPlot(this);
            setCentralWidget(plot);
    
            // 创建曲线对象
            curve = new QwtPlotCurve();
            curve->setPen(Qt::blue, 2);  // 设置曲线颜色和宽度
            curve->attach(plot);
    
            // 设置x轴和y轴范围
            plot->setAxisScale(QwtPlot::xBottom, 0, 20);  // 设置x轴范围
            plot->setAxisScale(QwtPlot::yLeft, -10, 10);  // 设置y轴范围
    
            // 创建定时器
            timer = new QTimer(this);
            connect(timer, SIGNAL(timeout()), this, SLOT(updateCurveData()));
            timer->start(1000);  // 每秒更新一次曲线数据
        }
    
    private slots:
        void updateCurveData() {
            // 从函数接口获取最新的时间和位置值
            double time = getTimeFromFunction();
            double position = getPositionFromFunction();
    
            // 更新曲线数据
            QwtPointSeriesData* data = new QwtPointSeriesData();
            data->append(QPointF(time, position));
            curve->setData(data);
    
            // 动态调整x轴范围,使曲线平移
            plot->setAxisScale(QwtPlot::xBottom, time - 20, time);
    
            plot->replot();  // 重新绘制曲线图
        }
    
    private:
        QwtPlot *plot;
        QwtPlotCurve *curve;
        QTimer *timer;
    
        double getTimeFromFunction() {
            // 从函数接口获取最新的时间值
            // TODO: 实现获取最新时间值的函数逻辑
            return 0;
        }
    
        double getPositionFromFunction() {
            // 从函数接口获取最新的位置值
            // TODO: 实现获取最新位置值的函数逻辑
            return 0;
        }
    };
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

思路很简单,使用定时器,比如你定义2个数组,一个数组存放时间,另一个存放时间对应的值,然后比如每500ms调用一次,取刷新界面,在这个过程中,你需要不停的往数组内写入新的值