charts - Wt 动态图表和图形

标签 charts wt

使用 Wt(一个用于 Web 开发的 C 库),我尝试上传 .wav 文件,然后在图表中打印其值。有没有办法动态地做到这一点,换句话说,将点添加到已经创建的图表中?

最佳答案

是的,有一种方法可以做到这一点,我曾经编写了一些代码来监视内存使用情况并在图表中打印该信息,就像 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()

进来的 double 是要添加到图表中的数据本身。我有一个boost线程每秒调用这个函数传入新数据,它在运行时看起来与任务管理器完全相同。我不确定您是否正在尝试动态更新它或只是用数据填充它,但我希望这会有所帮助并让您走上正确的轨道!

关于charts - Wt 动态图表和图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17650214/

相关文章:

Wt 数据库 Wt::Dbo

javascript - Wt(诙谐)。对 Javascript 实现不起作用一无所知

C# Chart Control 为大高度生成巨大的标题

C# devexpress Chart如何获取数据

c++ - 使用 Wt 和 libHARU 未定义引用渲染 PDF

c++ - 使用 QtCreator(qmake) 编译 wtwithqt 示例

javascript - 是否可以向柱形图中的一个 google-chart 栏添加多个标签?

android - 如何增加雷达图 MPAndoid Chart 的大小?

asp.net - 打印预览中不显示图表区域

javascript - 从 Qt 应用程序转换为 Web 应用程序的建议