我想知道如何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示例以某种方式完成它.我不明白怎么做.但是这种情况有点不同,因为它用新的替换系列中的所有点,而不是附加它们.
首先,如果您将在 GUI 线程中以 400000 点/秒的速度接收和附加点,您的应用程序将完全冻结。因此,您需要专门使用另一个线程来接收和处理数据,并使用(例如)与QueuedConnection连接的信号/槽将处理后的图形数据发送到 GUI 线程。我所说的“处理”是指至少某种抽取(DSP 人员所理解的平均、丢弃、抽取),因为 400000 点/秒似乎很快,你会浪费你的内存和 GUI 性能。但如果你不想毁灭,那取决于你。在这种情况下,您可以考虑比 ed 信号/槽更轻量级的数据传递机制QueuedConnection。
第二个问题是什么时候出图?不久前,我以QCustomPlot低得多的速度实现了类似的功能。我面临的主要问题是,当我在收到每个点后尝试重新绘制时,特别是在绘制抗锯齿图时,会出现巨大的(且变化的)滞后。在您的情况下,解决方案是子类化QChartView(我想您已经完成了),覆盖timerEvent它并在需要开始/停止重新绘制时调用startTimer()/ 。killTimer()或者,您可以在拥有该对象的对象中保存一个计时器QChartView,并从那里重新绘制,但与子类化相比,它看起来像是抽象泄漏QChartView。总而言之,这种方法可以让您实现几乎恒定的帧速率,并使其如您所愿地流畅,而不会冻结应用程序的界面。
最后,如何重新绘制?QChartView似乎有repaint()继承的方法QWidget可以满足您的需要。
| 归档时间: |
|
| 查看次数: |
7772 次 |
| 最近记录: |