Здравствуйте. Разбираясь в Qwt и построении графиков в нем соответственно возник вопрос по реализации на оси Х шкалы реального времени. Много статей просмотрел про метод QwtScaleDraw, но так и не смог реализовать в своем коде. У кого найдется минутка прошу подсказать. Спасибо за внимание.
Код:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <qwt_plot_curve.h>
#include <QTime>
#include <QThread>
#include <qwt_date_scale_draw.h>
namespace Ui {
class dialog;
}
class Dialog: public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::dialog *ui;
QwtPlotCurve *curve;
QPolygonF points;
private slots:
void spinBoxvalue();
void spinBoxvalue2();
public slots:
void startPressed();
void Timetopush();
};
class TimeScaleDraw: public QwtScaleDraw
{
public:
TimeScaleDraw(const QTime &base):
baseTime(base)
{
}
virtual QwtText label(double v) const
{
QTime upTime = baseTime.addSecs((int)v);
return upTime.toString();
}
private:
QTime baseTime;
};
#endif // DIALOG_H
Код:
#include "dialog.h"
#include "ui_dialog.h"
#include "owen_io.h"
#include <QtCore>
#include <QMessageBox>
#include <qwt_plot.h>
#include <qwt_plot_grid.h>
#include <qwt_legend.h>
#include <qwt_plot_curve.h>
#include <qwt_symbol.h>
#include <qwt_plot_magnifier.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_picker.h>
#include <qwt_picker_machine.h>
Dialog::Dialog(QWidget *parent):
QDialog(parent),
ui(new Ui::dialog)
{
ui->setupUi(this);
curve = new QwtPlotCurve();
ui->widget->setTitle("Grafik");
ui->widget->setCanvasBackground(Qt::white);
ui->widget->setAxisTitle(QwtPlot::yLeft, "Temperature");
ui->widget->setAxisScale(QwtPlot::yLeft, 0, 100);
ui->widget->setAxisTitle(QwtPlot::xBottom, "Time");
ui->widget->setAxisScaleDraw(QwtPlot::xBottom, new TimeScaleDraw(QTime::fromString("00:00:00","hh,mm,ss")));
ui->widget->setAxisScale(QwtPlot::xBottom, 0.0 , 86400.0, 3600);
ui->widget->setAxisLabelRotation(QwtPlot::xBottom, -50.0);
ui->widget->setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom);
ui->widget->insertLegend(new QwtLegend());
QwtPlotMagnifier *magnifier = new QwtPlotMagnifier(ui->widget->canvas());
magnifier->setMouseButton(Qt::MidButton);
QwtPlotPanner *d_panner = new QwtPlotPanner(ui->widget->canvas());
d_panner->setMouseButton(Qt::RightButton);
QwtPlotPicker *d_picker = new QwtPlotPicker(QwtPlot::xBottom,QwtPlot::yLeft,
QwtPlotPicker::CrossRubberBand,
QwtPicker::ActiveOnly,
ui->widget->canvas());
d_picker->setRubberBandPen(QColor(Qt::red));
d_picker->setTrackerPen(QColor(Qt::black));
d_picker->setStateMachine(new QwtPickerDragPointMachine());
QwtPlotGrid *grid = new QwtPlotGrid();
grid->setMajorPen(QPen(Qt::gray, 2));
grid->attach(ui->widget);
curve->setTitle("Pokazatel'");
curve->setPen(Qt::red, 6);
curve->setRenderHint(QwtPlotItem::RenderAntialiased, true);
curve->attach(ui->widget);
connect(ui->Stop, SIGNAL(clicked()), this, SLOT(close()));
connect(ui->Start,SIGNAL(clicked()),this,SLOT(startPressed()));
connect(ui->spinBox,SIGNAL(valueChanged(int)), this, SLOT(spinBoxvalue(int)));
connect(ui->spinBox2,SIGNAL(valueChanged(int)),this, SLOT(spinBoxvalue2(int)));
ui->Stop->hide();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::spinBoxvalue()
{
ui->spinBox -> value();
}
void Dialog::spinBoxvalue2()
{
ui->spinBox2 -> value();
}
void Dialog::startPressed()
{
QTimer *timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(Timetopush()));
timer->start(1000);
int newVariable = ui->spinBox -> value();
QTime midnight(0,0,0);
qsrand(midnight.secsTo(QTime::currentTime()));
int newVariable2 = ui->spinBox2 -> value();
accept();
ui->Stop->show();
}
void Dialog::Timetopush()
{
float value;
value=float(qrand())/RAND_MAX*99+1;
points << QPointF (points.count(), value);
curve->setSamples(points);
}