Название: Qwt
Отправлено: Sergey от Сентябрь 20, 2011, 19:26
Есть готовый проект .Я скинул скриншот его , надо что б шкала оси X изменялось во времени как в примере Qwt сpuplot. Подскажите как лучше сделать , если надо скинуть исходные коды программы , то я скину. Если что то надо более подробно описать ,я опишу .
Заранее спасибо !
Название: Re: Qwt
Отправлено: alexman от Сентябрь 20, 2011, 19:47
А что в примере не понятно?
Название: Re: Qwt
Отправлено: Sergey от Сентябрь 20, 2011, 23:04
Ну я не могу понять как всунуть это в мой пример. Если б вы помогли с этим разобратся был бы признателен.
Название: Re: Qwt
Отправлено: alexman от Сентябрь 21, 2011, 10:10
Есть функция void QwtPlot::setAxisScale(int axisId, double min, double max, double step = 0); - задает контент шкалы. Ну а делать это можно по таймеру , например.
Название: Re: Qwt
Отправлено: Sergey от Сентябрь 22, 2011, 14:20
Я примерно представляю , какие ф-ции мне надо использовать, но как совместить с моим проетком не понимаю . Может я вам свой проект скину и вы посмотрите примерно как можно соединить ф-ции с моим проектом .
Название: Re: Qwt
Отправлено: alexman от Сентябрь 22, 2011, 15:46
Плохой подход. Лучше начни как-нить и задавай вопросы по ходу.
Название: Re: Qwt
Отправлено: Sergey от Сентябрь 22, 2011, 16:51
Если вам не трудно напишите свой скайп в личку , мне кажется там проще задавать вопросы !
Название: Re: Qwt
Отправлено: Sergey от Сентябрь 22, 2011, 17:23
Вот отдельные моменты моей программы , некоторые куски брал из cpuplot . По моей задумке в signal.cpp должна происхоодить прорисовка . #include <stdlib.h> #include <cmath> #include <qwt_painter.h> #include <qwt_plot_canvas.h> #include <qwt_plot_marker.h> #include <qwt_plot_curve.h> #include <qwt_scale_widget.h> #include <qwt_legend.h> #include <qwt_scale_draw.h> #include <qwt_math.h> #include "signal.h" #include <qwt_plot_grid.h> #include <qwt_plot_marker.h> #include <qpainter.h> #include <QSpinBox> #include "stat.h"
// Инцилизируем график DataPlot::DataPlot(QWidget *parent):
QwtPlot(parent), d_interval(0), d_timerId(-1) { QwtPlotGrid *grid = new QwtPlotGrid;//создание сетки grid->setMajPen(QPen(Qt::gray, 1));// устанавливается цвет пера которым рисуем сетку grid->attach(this); grid->setZ(-100);//глубина залегания сетки по сравнению со стробом и сигналом
curve = new QwtPlotCurve();//создание строба curve->attach(this); //Начальное положение строба posX = 1.0; posY = 5.0; lenX = 5.0;
alignScales();// f = 5; for (int i = 0; i< PLOT_SIZE; i++) { d_x[i] = 0.5 * i; // time axis d_y[i] = 0; d_z[i] = 0; } setTitle("Graphic");//устанавливается название графика setCanvasColor(Qt::black);//устанавливается фон графика QwtPlotCurve *cRight = new QwtPlotCurve();//cоздаётся сигнал cRight->attach(this);
cRight->setPen(QPen(Qt::red));//устанавливается цвет пера которым рисуется сигнал
cRight->setRawData(d_x, d_y, PLOT_SIZE);
setAxisTitle(QwtPlot::xBottom, "Time/seconds");//название шкалы setAxisScaleDraw(QwtPlot::xBottom, new TimeScaleDraw(cpuStat.upTime())); setAxisScale(QwtPlot::xBottom, 0, 100,10); // масштаб шкалы strob(); setAxisTitle(QwtPlot::yLeft, "Amplituda");//название Y шкалы setAxisScale(QwtPlot::yLeft, 0, 10,1); //масштаб шкалы
setTimerInterval(0.0);
} //Создание шкалы void DataPlot::alignScales() {
canvas()->setFrameStyle(QFrame::Box | QFrame::Plain ); canvas()->setLineWidth(2);
for ( int i = 0; i < QwtPlot::axisCnt; i++ ) { QwtScaleWidget *scaleWidget = (QwtScaleWidget *)axisWidget(i); if ( scaleWidget ) scaleWidget->setMargin(2); QwtScaleDraw *scaleDraw = (QwtScaleDraw *)axisScaleDraw(i); if ( scaleDraw ) scaleDraw->enableComponent(QwtAbstractScaleDraw::Backbone,false); } } //Cоздание сигнала в динамике void DataPlot::setTimerInterval(double ms) { d_interval = qRound(ms);
if ( d_timerId >= 0 ) { killTimer(d_timerId); d_timerId = -1; } if (d_interval >= 0 ) d_timerId = startTimer(d_interval); }
void DataPlot::timerEvent(QTimerEvent *) { static double phase = 0.0;
if (phase > (M_PI - 0.0001)) phase = 0.0; for ( int i = PLOT_SIZE - 1; i > 0; i-- ) d_y[i] = d_y[i-1]; d_y[0] = sin(phase) * (-1.0 + 8.0 * double(rand()) / double(RAND_MAX));
for ( int j = 0; j < PLOT_SIZE - 1; j++ ) d_z[j] = d_z[j+1];
d_z[PLOT_SIZE - 1] = 0.8 - (8.0 * phase/M_PI) + 0.4 * double(rand()) / double(RAND_MAX); replot(); phase += M_PI*0.02; } // В данной функции устанавливается фон графика ( функция использована выше ) void DataPlot::setCanvasColor(const QColor &c) { setCanvasBackground(c); replot(); } // В данной функции создаётся строб void DataPlot::strob() {
curve->setPen(QPen(Qt::blue,3)); curve->setZ(1000); double x[2],y[2]; x[0]=posX; y[0]=posY; x[1]=posX+lenX; y[1]=posY; curve->setData(x, y, sizeof(x) / sizeof(x[0])); replot(); } // Изменяется координата X строба void DataPlot::setLenX(double LenX) { lenX=LenX; strob(); } // Изменяется координата Y строба void DataPlot::setPosY(double PosY) { posY = PosY; strob(); } //Изменяется длина строба void DataPlot::setPosX(double PosX) { posX=PosX; strob(); } void CpuPlot::timerEvent(QTimerEvent *) { for ( int i = dataCount; i > 0; i-- ) { for ( int c = 0; c < NCpuData; c++ ) { if ( i < HISTORY ) data[c].data[i] = data[c].data[i-1]; } }
cpuStat.statistic(data[User].data[0], data[System].data[0]);
data[Total].data[0] = data[User].data[0] + data[System].data[0]; data[Idle].data[0] = 100.0 - data[Total].data[0];
if ( dataCount < HISTORY ) dataCount++;
for ( int j = 0; j < HISTORY; j++ ) timeData[j]++;
setAxisScale(QwtPlot::xBottom, timeData[HISTORY - 1], timeData[0]);
for ( int c = 0; c < NCpuData; c++ ) { data[c].curve->setRawData( timeData, data[c].data, dataCount); }
replot(); }
Сейчас покажу что творится в h файлах ( 'это не все h файлы ) stat.h-взят с примера сpuplot #ifndef STAT_H #define STAT_H class CpuStat { public: CpuStat(); void statistic(double &user, double &system); QTime upTime() const;
enum Value { User, Nice, System, Idle,
NValues };
private: void lookUp(double[NValues]) const; double procValues[NValues]; }; CpuStat::CpuStat() { lookUp(procValues); }
//QTime CpuStat::upTime() const //{ // QTime t; // for ( int i = 0; i < NValues; i++ ) // t = t.addSecs(int(procValues[i] / 100)); // // return t; //} //};
#endif // STAT_H
И теперь signal.h #ifndef _DATA_PLOT_H #define _DATA_PLOT_H
#include <qwt_plot.h> #include <qwt_plot_curve.h> #include <qwt_scale_draw.h> #include "stat.h" #include <QTime> #include <QLocale> #define HISTORY 60 // seconds class QwtPlotMarker; class QwtPlotCurve; const int PLOT_SIZE = 201; // 0 to 200
class DataPlot : public QwtPlot { Q_OBJECT
public: DataPlot(QWidget* = NULL); double l; double f; double posX ; double posY ; double lenX ; QwtPlotCurve *curve; public slots: void setTimerInterval(double interval); void setCanvasColor(const QColor &); void strob(); void setPosX(double); void setPosY(double); void setLenX(double); protected: virtual void timerEvent(QTimerEvent *e); private: void alignScales(); double d_x[PLOT_SIZE]; double d_y[PLOT_SIZE]; double d_z[PLOT_SIZE]; int d_interval; // timer in ms int d_timerId; }; class TimeScaleDraw: public QwtScaleDraw { public: TimeScaleDraw() {}
virtual QwtText label(double v) const { QTime time((int)v, 0); QString format = QLocale::system().timeFormat(QLocale::ShortFormat); return time.toString(format); } };
// то что сейчас добавил class CpuPlot : public QwtPlot { Q_OBJECT public: enum CpuData { User, System, Total, Idle,
NCpuData };
CpuPlot(QWidget * = 0); const QwtPlotCurve *cpuCurve(int id) const { return data[id].curve; }
protected: void timerEvent(QTimerEvent *e);
private slots: void showCurve(QwtPlotItem *, bool on);
private: struct { QwtPlotCurve *curve; double data[HISTORY]; } data[NCpuData]; double timeData[HISTORY];
int dataCount; CpuStat cpuStat; };
#endif Сейчас выскакивает ошибка такая : C:/re_cnop2/re_cnop2/re_cnop/signal.cpp:56: error: 'cpuStat' was not declared in this scope Но я не уверен правильный ли сам алгоритм и идея программы . Получить я должен просто изменяющая во времени ось x Извините за дурацике вопросы .Просто новичок . И спасибо большое )
|