- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想让我的 QChart 在一个点被添加到附加到它的 QLineSeries 对象时动态更新,但似乎这个更新只发生在我正在运行的 while 循环完成之后。我在 interface.cpp 中使用所说的 while 循环调用函数 updatePlot() 将数据点添加到线系列,但这只会在 while 循环完全完成后更新图表。这里发生的伪代码:
qtwindow.cpp
// Constructor that initializes the series which will be passed into the interface
AlgoWindow::AlgoWindow( ..., TradingInterface* interface, ... ) {
...
QLineSeries* series = new QLineSeries();
QLineSeries* benchmark = new QLineSeries();
QChart* chart = new QChart();
chart->addSeries(series);
chart->addSeries(benchmark);
// Also creates custom axes which are attached to each series
...
}
// Slot connected to a button signal
void AlgoWindow::buttonClicked() {
// Runs the backtest
interface->runbacktest(..., series, benchmark, ...);
}
接口(interface).cpp
void TradingInterface::runbacktest(..., QtCharts::QLineSeries* algoplot, QtCharts::QLineSeries* benchplot) {
// Runs a huge while loop that continuously checks for events
while (continue_backtest) {
if (!eventsqueue.isEmpty()) {
// Handle each event for the bar
} else {
// All events have been handled for the day, so plot
updatePlot(algoplot, benchplot);
}
}
}
void TradingInterface::updatePlot(QtCharts::QLineSeries *algoseries,
QtCharts::QLineSeries *benchseries) {
// Get the date and the information to put in each point
long date = portfolio.bars->latestDates.back();
double equitycurve = portfolio.all_holdings.rbegin().operator*().second["equitycurve"];
double benchcurve = benchmarkportfolio.all_holdings.rbegin().operator*.second["equitycurve"];
// Append the new points to their respective QLineSeries
algoseries->append(date * 1000, equitycurve*100);
benchseries->append(date * 1000, benchcurve*100);
}
这没有给我任何错误并且 while 循环完成,但线条仅在 runbacktest() 退出后绘制。然后它会正确绘制所有数据,但一次绘制。
我需要做的是在每次添加行时更新 QChart,我猜这是使用某种形式的自定义信号槽监听器,但我不知道如何去做。如果图表在函数完成后才会更新,甚至可以在 QChart 框架内实现吗?
此外,我已经尝试过 QChart::update() 和 QChartView::repaint()。两者都产生了相同的结果。
编辑: 我尝试设置一个新线程,只要数据完成,它就会向主线程发出信号,但它似乎没有任何改变。在输入所有数据之后,QChart 仍然不会更新。我添加了几行来帮助调试,看起来发出信号的函数运行得很好,但是接收信号的槽函数只在线程完成后运行。不仅如此,通过 sleep 减慢信号速度并不会使其绘制缓慢(就像我想的那样),因为 QChart 仍然拒绝更新,直到最终更新到 addData() 之后。
最佳答案
要么删除您的 while 循环并使用计时器一次执行一个步骤。
或者在另一个线程中运行您的 runbacktest
函数,并在数据准备就绪时发送信号以更新 UI 线程中的 QChart
。
无论哪种方式,您都需要将控制权交还给事件循环,以便重新绘制图表。
关于c++ - 在运行的 while 循环中从 QLineSeries 更新 QChart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50996127/
我需要按 y 轴对 QLineSeries 和它们内部的点进行排序。我是 c++ 和 qt 的新手,所以我试过了 QLineSeries* series = lineSeriesMap.value(k
我似乎找不到包含 的方法在我的标题中,以便 Qt 知道 QLineSeries 类。 我添加了 Qt += charts到我的 .pro 文件。 我添加了 #include 至 MainWindow
我能够使用 Python 中的 QtCharts 库生成图表,但我似乎不知道如何向我的图表添加轴标签... 我看到了 QValueAxis 的 setLabelFormat() 功能,但没有看到如何设
我正在努力实现类似 https://doc.qt.io/qt-5.9/qtcharts-datetimeaxis-example.html 的目标. 在一个方法中我有这段代码 QDateTime pa
有什么方法可以为添加到 QChart 的某些 QAbstractSeries 订购 z-index? 似乎 QChart 在内部是这样做的。 最佳答案 Zlevel 由 QtCharts::Chart
m_total_hour_series->append(pair.first, pair.second);行是问题的根源。错误消息说:没有匹配的函数来调用'QtCharts::QLineSeries:
我想让我的 QChart 在一个点被添加到附加到它的 QLineSeries 对象时动态更新,但似乎这个更新只发生在我正在运行的 while 循环完成之后。我在 interface.cpp 中使用所说
我目前正在使用 QLineSeries 来表示温度随时间变化的关系。 我连接了一个温度传感器。它每分钟发送一次数据。 问题是,测量是在 20 分钟的时间段内进行的,之后传感器处于非事件状态 60 分钟
我正在尝试创建一个可以绘制大型数据集的应用程序(因此使用 OpenGl 对我来说很重要)。我使用 QChartView、QChart 和 QLineSeries。同样对于 QLineSeries,我打
我是一名优秀的程序员,十分优秀!