Russian Qt Forum

Программирование => Общий => Тема начата: Sergey от Сентябрь 20, 2011, 19:26



Название: 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

Извините за дурацике вопросы .Просто новичок .  И спасибо большое )