使用Wt,一个用于Web开发的C库,我试图上传一个.wav文件,然后在图表中打印它的值。有没有办法动态地执行此操作,换句话说,将点添加到已创建的图表?
答案 0 :(得分:4)
是的,有一种方法可以做到这一点,我曾编写一些代码来监控内存使用情况并在图表中打印该信息,就像Windows任务管理器的性能选项卡一样。我使用了一个boost线程来不断更新它。以下是一些代码可能会使您的图表问题朝着正确的方向发展。
您将需要WCartesianChart
Wt::Chart::WCartesianChart* _chart_memory_display;
现在,图表的初始化实际上非常棘手。我写了一个函数来做到这一点。 注意:这使用#define PERFORMANCE_HISTORY 100这是图表存储的数据量,据我所知没有限制,我只想要最后100点。
Wt::Chart::WCartesianChart* CreateCartesianChart(WContainerWidget* parent)
{
WStandardItemModel *model = new WStandardItemModel(PERFORMANCE_HISTORY, 2, parent);
//Create the scatter plot.
Wt::Chart::WCartesianChart* chart = new Wt::Chart::WCartesianChart(parent);
//Give the chart an empty model to fill with data
chart->setModel(model);
//Set which column holds X data
chart->setXSeriesColumn(0);
//Get the axes
Wt::Chart::WAxis& x_axis = chart->axis(Wt::Chart::Axis::XAxis);
Wt::Chart::WAxis& y1_axis = chart->axis(Wt::Chart::Axis::Y1Axis);
Wt::Chart::WAxis& y2_axis = chart->axis(Wt::Chart::Axis::Y2Axis);
//Modify axes attributes
x_axis.setRange(0, PERFORMANCE_HISTORY);
x_axis.setGridLinesEnabled(true);
x_axis.setLabelInterval(PERFORMANCE_HISTORY / 10);
y1_axis.setRange(0, 100);
y1_axis.setGridLinesEnabled(true);
y1_axis.setLabelInterval(10);
y2_axis.setRange(0, 100);
y2_axis.setVisible(true);
y2_axis.setLabelInterval(10);
//Set chart type
chart->setType(Wt::Chart::ChartType::ScatterPlot);
// Typically, for mathematical functions, you want the axes to cross at the 0 mark:
chart->axis(Wt::Chart::Axis::XAxis).setLocation(Wt::Chart::AxisValue::ZeroValue);
chart->axis(Wt::Chart::Axis::Y1Axis).setLocation(Wt::Chart::AxisValue::ZeroValue);
chart->axis(Wt::Chart::Axis::Y2Axis).setLocation(Wt::Chart::AxisValue::ZeroValue);
// Add the lines
Wt::Chart::WDataSeries s(1, Wt::Chart::SeriesType::LineSeries);
chart->addSeries(s);
//Size the display size of the chart, has no effect on scale
chart->resize(300, 300);
return chart;
}
基本上,WT图表需要一个模型和一个准备好接收数据的数据系列。我强烈建议你阅读那些你不认识的功能的文件,我花了一些时间将各个部分放在一起。另外,查看WT小部件库,它有图表和代码示例。
现在,为了实际更新,我写了另一个函数。
void UpdateChartDisplay(Wt::WAbstractItemModel* data_model, double data)
{
//Update the old data
for(unsigned int i = 0; i < PERFORMANCE_HISTORY; i++)
{
//Move all data back one index
data_model->setData(i, 0, i);
data_model->setData(i, 1, data_model->data(i+1, 1));
}
//Get the last index of the data
int insertion_point = PERFORMANCE_HISTORY - 1;
//Insert new data at the last index
data_model->setData(insertion_point, 0, insertion_point);
data_model->setData(insertion_point, 1, data);
}
现在,data_model只是正在更新的图表的模型,
_chart_memory_display->model()
双重进入,是正在添加到图表中的数据本身。我有一个boost线程,每秒传入一个新数据调用此函数,它看起来就像运行时的任务管理器。我不确定您是要尝试动态更新它还是只填充数据,但我希望这会有所帮助并让您走上正确的轨道!
答案 1 :(得分:1)
我认为当您拥有模型并更新该模型时,图表会自动更新为视图。
创建自己的模型并在那里执行业务逻辑。让Wt处理图表视图。