Здравствуйте. Разбираясь в Qwt и построении графиков в нем соответственно возник вопрос по реализации на оси Х шкалы реального времени. Много статей просмотрел про метод QwtScaleDraw, но так и не смог реализовать в своем коде. У кого найдется минутка прошу подсказать. Спасибо за внимание. Код | #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); }
|
и собственно h: Код | #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
|
|