如何重新绘制QChart

A. *_*ira 5 c++ qt qtcharts

我想知道如何QChart在添加新点后添加新点QLineSeries. 目标是使用它来显示以高速率(高达400 000点/秒)采集的数据,并在点到达数据包时更新绘图.

这是我一直在研究的测试程序:

主窗口:

class MainWindow : public QMainWindow{
    Q_OBJECT

    QLineSeries *series;
    QChart *chart;
    QChartView *chartView;

    int cnt=0;


public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pB_Start_clicked();

private:
    Ui::MainWindow *ui;
};
Run Code Online (Sandbox Code Playgroud)

MainWindow构造函数:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){
    ui->setupUi(this);

    series = new QLineSeries();

    chart = new QChart();
    chart->setBackgroundRoundness(0);

    chart->addSeries(series);

 // A bunch of formatting
    chart->setBackgroundVisible(false);
    chart->setMargins(QMargins(0,0,0,0));
    chart->layout()->setContentsMargins(0,0,0,0);
    chart->legend()->hide();
    chart->setPlotAreaBackgroundBrush(QBrush(Qt::black));
    chart->setPlotAreaBackgroundVisible(true);
    chartView = new QChartView(chart);
    ui->gridLayout->addWidget(chartView);

}
Run Code Online (Sandbox Code Playgroud)

还有一个pushButton clicked事件可以为系列添加点数:

void MainWindow::on_pB_Start_clicked(){
    series->append(cnt,qSin(cnt/10));
    cnt++;
    // Update plot here << ======== HOW?
}
Run Code Online (Sandbox Code Playgroud)

OpenGLSeries示例以某种方式完成它.我不明白怎么做.但是这种情况有点不同,因为它用新的替换系列中的所有点,而不是附加它们.

Ser*_*gey 2

首先,如果您将在 GUI 线程中以 400000 点/秒的速度接收和附加点,您的应用程序将完全冻结。因此,您需要专门使用另一个线程来接收和处理数据,并使用(例如)与QueuedConnection连接的信号/槽将处理后的图形数据发送到 GUI 线程。我所说的“处理”是指至少某种抽取(DSP 人员所理解的平均、丢弃、抽取),因为 400000 点/秒似乎很快,你会浪费你的内存和 GUI 性能。但如果你不想毁灭,那取决于你。在这种情况下,您可以考虑比 ed 信号/槽更轻量级的数据传递机制QueuedConnection

第二个问题是什么时候出图?不久前,我以QCustomPlot低得多的速度实现了类似的功能。我面临的主要问题是,当我在收到每个点后尝试重新绘制时,特别是在绘制抗锯齿图时,会出现巨大的(且变化的)滞后。在您的情况下,解决方案是子类化QChartView(我想您已经完成了),覆盖timerEvent它并在需要开始/停止重新绘制时调用startTimer()/ 。killTimer()或者,您可以在拥有该对象的对象中保存一个计时器QChartView,并从那里重新绘制,但与子类化相比,它看起来像是抽象泄漏QChartView。总而言之,这种方法可以让您实现几乎恒定的帧速率,并使其如您所愿地流畅,而不会冻结应用程序的界面。

最后,如何重新绘制?QChartView似乎有repaint()继承的方法QWidget可以满足您的需要。