2013-07-15 3 views
2

Используя Wt, библиотеку C для веб-разработки, я пытаюсь загрузить WAV-файл, а затем распечатать его значения в диаграмме. Есть ли способ сделать это динамически, другими словами, добавить точки в уже созданную диаграмму?Wt Динамические диаграммы и графики

ответ

1

Я думаю, что когда у вас есть модель, и вы обновляете эту модель, график автоматически обновляется как представление.

Создайте свою собственную модель и выполните свою бизнес-логику. Пусть Wt обрабатывает вид графика.

+0

Спасибо, но как я могу обновить модель? – user2424276

+0

Посмотрите на примеры диаграмм: http://www.webtoolkit.eu/wt/examples/charts –

4

Да, есть способ сделать это, я как-то написал код для мониторинга использования памяти и печати этой информации на диаграмме, так же как вкладка «Производительность» диспетчера задач Windows. Я использовал поток повышения, чтобы постоянно его обновлять. Вот код, который может привести вас в правильном направлении с вашей проблемой диаграммы.

Вам нужен 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 требуется модель, а серия данных должна быть готова к приему данных. I настоятельно рекомендую прочитать документацию на что-либо в этой функции, которую вы не узнаете, мне потребовалось некоторое время, чтобы собрать кусочки. Кроме того, проверьте галерею виджета 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, который вызывает эту функцию каждую секунду, проходящую в новых данных, она выглядит точно так же, как диспетчер задач при запуске. Я не уверен, что вы пытаетесь обновить его динамически или просто заполнить его данными, но я надеюсь, что это поможет вам и вернет вас на правильный путь!

+0

Большое спасибо за это. Я боролся с примерами Wt, которые слишком сложны - они должны обеспечить очень простой рабочий пример. Документы Wt, которые я нашел, очень плотные и, похоже, не объясняют, как сделать что-то просто, шаг за шагом. Если вы знаете некоторые документы, которые делают, пожалуйста, дайте мне знать. Я обожаю Wt, и у меня очень мало проблем с тем, чтобы справиться с этим, имея опыт работы со многими другими графическими интерфейсами. Но графический материал неприятен. – Vector

+0

Единственная твердая документация, которую я нашел, - это их стандартные документы здесь http://www.webtoolkit.eu/wt/doc/reference/html/index.html и галерея виджета. У них также есть официальный форум http://redmine.webtoolkit.eu/projects/wt/boards, где вы можете публиковать вопросы сообществу или разработчикам. Вы также можете запросить функции у разработчиков, на самом деле я получил одобрение не так давно: D Feature # 3175 http://redmine.webtoolkit.eu/issues/3175#change-9919 Кроме этого, я просто Google или копаю через переполнение стека. – user2115945

+0

Я видел большую часть этого материала - спасибо. _Другая, я просто Google или выкапываю Stack Overflow_: В основном я просто продолжаю взламывать, пока не получу что-то для работы.Много работая с Qt и gtkmm, я считаю, что Wt будет довольно элегантным и интуитивно понятным в большинстве случаев - я быстро встал и работал очень быстро. Но диаграмма противна - не то, что она намного лучше в других рамках - хорошие диаграммы по своей сути сложны, особенно если вы делаете в реальном времени обновление с ними. Чего не хватает - хорошая книга о Wt, которая организует вещи и проводит вас. Я люблю Wt - очень мощный материал. – Vector

Смежные вопросы