- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这段代码,它适用于最大 1000 的数据大小。现在我用 65536 个点对其进行了测试。
series = new QLineSeries();
QList<QPointF> points;
points.reserve(data.size());
for(std::vector<int>::size_type i = 0; i != data.size(); i++) {
QPointF point(i, data[i]*100/max);
points.append(point);
}
series->clear();
series->append(points);
应用程序在 1 个核心满功率时卡住。我在几分钟后停止了它。
如何防止 Qt 变得无响应。这个数据大小并不特殊,我希望图 TableView 能够处理高达百万点的数据集。
编辑:我测量了时间
series->append(points);
2000点需要1秒。这意味着大约一分钟 > 50.000 那是不可用的。
更糟糕的是,对数刻度图
serieslog->append(points);
2000点需要40秒。那是完全不能用的。原因是调试消息,几乎每个点都会打印出来。
QtCharts::XLogYDomain::calculateGeometryPoints(const QVector&) const>; Logarithms of zero and negative values are undefined.
我可以用
加速线性图 series->setUseOpenGL(true);
然而,对于 65536,它仍然需要 14 秒,这意味着每个点 200 微秒。还是很多。我想要一个最低 10 Hz 的实时视频和一个实时直方图。时间必须 << 1 秒。
编辑:这是一个工作示例,使用我的代码
#include <QDebug>
#include <QTime>
#include <cmath>
#include <stdlib.h>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QLogValueAxis>
#include <QtCharts/QValueAxis>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
QT_CHARTS_USE_NAMESPACE
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLineSeries * series;
QLineSeries * serieslog;
QChart * chart;
QChartView * chartView;
QValueAxis * axisX;
QValueAxis * axisY;
QLogValueAxis * axisY3;
chart = new QChart();
chart->legend()->hide();
chart->setTitle("Histogramm");
axisX = new QValueAxis;
chart->addAxis(axisX, Qt::AlignBottom);
series = new QLineSeries;
chart->addSeries(series);
axisY = new QValueAxis;
axisY->setTitleText("linear scale");
axisY->setLinePenColor(series->pen().color());
axisY->setGridLinePen((series->pen()));
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisX);
series->attachAxis(axisY);
serieslog = new QLineSeries;
chart->addSeries(serieslog);
axisY3 = new QLogValueAxis();
axisY3->setTitleText("logarithmic scale");
axisY3->setLabelFormat("%g");
axisY3->setLinePenColor(serieslog->pen().color());
axisY3->setGridLinePen((serieslog->pen()));
axisY3->setMinorTickCount(-1);
chart->addAxis(axisY3, Qt::AlignRight);
serieslog->attachAxis(axisX);
serieslog->attachAxis(axisY3);
chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// create data
std::vector<int> data;
int N = 10000;
data.resize(N);
for (int i=0; i < N; ++i){
int value = static_cast<int>(fabs((sin(static_cast<double>(i)/1000.0)+1)*1+ std::rand() % 100)+10);
data[i] = value;
}
QList<QPointF> points;
points.reserve(data.size());
for(std::vector<int>::size_type i = 0; i != data.size(); i++) { //
QPointF point(i, data[i]);
points.append(point);
}
QTime myTimer;
myTimer.start();
series->clear();
// series->setUseOpenGL(true);
series->append(points);
qDebug() << "seconds lin: " << myTimer.elapsed();
myTimer.start();
serieslog->clear();
serieslog->append(points);
qDebug() << "seconds log: " << myTimer.elapsed();
chart->axisX()->setRange(0, data.size());
chart->axisY()->setRange(-10, 250);
QMainWindow window;
window.setCentralWidget(chartView);
window.resize(800, 600);
window.show();
return app.exec();
}
QT += core
QT += widgets
QT += gui
QT += charts
SOURCES += \
main.cpp
我测量毫秒林:1624毫秒日志:6801
最佳答案
我可以重现这个问题(经过类似的时间),这似乎是 QXYSeries::append
处理 QList
的方式的问题。从代码...
void QXYSeries::append(const QList<QPointF> &points)
{
foreach (const QPointF &point , points)
append(point);
}
和...
void QXYSeries::append(const QPointF &point)
{
Q_D(QXYSeries);
if (isValidValue(point)) {
d->m_points << point;
emit pointAdded(d->m_points.count() - 1);
}
}
因此,每次添加点都可能导致 QVector
d->m_points
调整大小并发出 pointAdded
信号。
鉴于您在调用 QXYSeries::append
之前清除了与系列相关的所有数据,您可以改用 QXYSeries::replace
。
如果您必须将初始数据生成为QList
,那么只需使用...
series->replace(points);
但是,它在内部使用 QList::toVector
,所以如果您可以将数据生成为 QVector
那么就更好了...
QVector<QPointF> points(data.size());
for(std::vector<int>::size_type i = 0; i != data.size(); ++i) {
points[i] = QPointF(i, data[i]);
}
QTime myTimer;
myTimer.start();
series->replace(points);
qDebug() << "\nlin: " << myTimer.elapsed() << "ms\n";
myTimer.start();
serieslog->replace(points);
qDebug() << "\nlog: " << myTimer.elapsed() << "ms\n";
上述代码在我自己的系统上导致...
lin: 1 ms
log: 3 ms
为了 10k 点,为了 100k 点...
lin: 6 ms
log: 22 ms
关于qt - QChart 对大数据集无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52320696/
我有一个为给定数据绘制烛台的类(class)。我正在尝试在收到新数据后立即动态更新绘图。以不规则的间隔接收数据。 我可以使用什么机制让类(class)知道是时候更新绘图并根据新接收的数据点更新绘图?
我有这段代码,它适用于最大 1000 的数据大小。现在我用 65536 个点对其进行了测试。 series = new QLineSeries(); QList points; points.rese
我有这段代码,它适用于最大 1000 的数据大小。现在我用 65536 个点对其进行了测试。 series = new QLineSeries(); QList points; points.rese
我有一个 2Y 轴图,在 y1 上有一个 QValueAxis,在 y2 上有一个 QLogValueAxis。 显示线性图,未显示对数图。两者的数据是一样的。 我想知道如何设置对数轴的刻度和限制?
我想知道如何在将新点附加到添加到 QLineSeries 之后重绘 QChart。目标是使用它来显示以高速率(高达 400 000 点/秒)获取的数据,并在点以数据包形式到达时更新绘图。 这是我一直在
本文主要介绍了Qt QChart 创建图表,分享给大家,也给自己留个笔记,废话不多说,具体如下: 效果 流程 代码 1. 饼图 // 保存多个扇形QList<QPieSl
使用 Zoom Line Example我做了一个 Python QChartView可以使用箭头键滚动并使用加号和减号键缩放的类。 (见下面我的代码)。 当我向左滚动时,我希望网格线和轴刻度滚动与数
我使用pyqt5绘制一个简单的图表,需要添加自定义轴,但是当我添加轴时,图表不显示它,当悬停信号发出时,我需要显示相应的点,但它也没有显示,需要点击才能显示。 class Demo(QChartVie
我必须创建一个图表并使用 QChart。所以我查看了 QChart 动态样条示例(因为我要创建一个动态图表),我在那里发现了一些奇怪的东西。 下面是启动屏幕。除setTickCount()外,代码为Q
我正在编写一个应用程序。在 QT c++ 中并有以下问题:单击 qchart 图的轴(不在图本身)时是否可以捕获鼠标事件? 我试图覆盖axes实例的事件方法,但是没有调用事件方法.. 我还尝试使用 Q
我正在尝试在单击 QChart 的位置绘制一个点。为此,我创建了一个“ChartWidget”类,它继承了 QChart 并像这样覆盖了 paint 方法: void ChartWidget::pai
我想生成一个包含文本和 QChart 的 pdf 报告。我目前使用 QTextDocument 并将图表作为图像添加到其中,然后我使用 QPdfWriter 导出为 pdf。 #include #i
我想在 ChartView 的右侧放置第二个 ValueAxis。 documentation指出“轴可以放置在图表的下、上、左或右。” 但是,我在 AbstractAxis、ValueAxis 或
我想在 ChartView 的右侧放置第二个 ValueAxis。 documentation指出“轴可以放置在图表的下、上、左或右。” 但是,我在 AbstractAxis、ValueAxis 或
我能够得到 QChart.js可以毫无问题地使用饼图(以及极坐标图和圆环图),但是每当我尝试创建折线图(以及雷达图和条形图)时,我都会收到以下错误: TypeError: Cannot read pr
QtCharts 组件是QT中提供图表绘制的模块,该模块可以方便的绘制常规图形,Qtcharts 组件基于GraphicsView模式实现,其核心是QChartView和QChart的二次封装版。
我正在开发数据分析软件,该软件从远程数据库获取数据并将其放入QTableWidget中。我怎样才能有效地从表中获取这些数据并将它们放入QChart中? 我发现,如果我一直使用QTableView,它可
我正在尝试使用 QScatterSeries 绘制 numpy 数组,但是仅更新轴并且不显示点。我不确定为什么它不起作用。 projectionwindow.py from PySide2.QtCor
我想让我的 QChart 在一个点被添加到附加到它的 QLineSeries 对象时动态更新,但似乎这个更新只发生在我正在运行的 while 循环完成之后。我在 interface.cpp 中使用所说
我尝试交叉编译 qt chart example对于 yocto platform .我按照以下步骤编译我的 qt 程序: 来源/opt/myimage/2.1.2/environment-setup
我是一名优秀的程序员,十分优秀!