📄 plot.cpp
字号:
#include "plot.h"
#include "colorbar.h"
#include <qevent.h>
#if QT_VERSION < 0x040000
#include <qwhatsthis.h>
#endif
#include <qwt_plot_layout.h>
#include <qwt_plot_canvas.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_curve.h>
#include <qwt_symbol.h>
#include <qwt_scale_widget.h>
#include <qwt_wheel.h>
#include <stdlib.h>
Plot::Plot(QWidget *parent):
QwtPlot(parent)
{
setTitle("Interactive Plot");
setCanvasColor(Qt::darkCyan);
QwtPlotGrid *grid = new QwtPlotGrid;
grid->setMajPen(QPen(Qt::white, 0, Qt::DotLine));
grid->attach(this);
// axes
setAxisScale(QwtPlot::xBottom, 0.0, 100.0);
setAxisScale(QwtPlot::yLeft, 0.0, 100.0);
// Avoid jumping when label with 3 digits
// appear/disappear when scrolling vertically
QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft);
sd->setMinimumExtent( sd->extent(QPen(),
axisWidget(QwtPlot::yLeft)->font()));
plotLayout()->setAlignCanvasToScales(true);
insertCurve(Qt::Vertical, Qt::blue, 30.0);
insertCurve(Qt::Vertical, Qt::magenta, 70.0);
insertCurve(Qt::Horizontal, Qt::yellow, 30.0);
insertCurve(Qt::Horizontal, Qt::white, 70.0);
replot();
// ------------------------------------
// We add a color bar to the left axis
// ------------------------------------
QwtScaleWidget *scaleWidget = (QwtScaleWidget *)axisWidget(yLeft);
scaleWidget->setMargin(10); // area for the color bar
d_colorBar = new ColorBar(Qt::Vertical, scaleWidget);
d_colorBar->setRange(Qt::red, Qt::darkBlue);
#if QT_VERSION >= 0x040000
d_colorBar->setFocusPolicy( Qt::TabFocus );
#else
d_colorBar->setFocusPolicy( QWidget::TabFocus );
#endif
connect(d_colorBar, SIGNAL(selected(const QColor &)),
SLOT(setCanvasColor(const QColor &)));
// we need the resize events, to lay out the color bar
scaleWidget->installEventFilter(this);
// ------------------------------------
// We add a wheel to the canvas
// ------------------------------------
d_wheel = new QwtWheel(canvas());
d_wheel->setOrientation(Qt::Vertical);
d_wheel->setRange(-100, 100);
d_wheel->setValue(0.0);
d_wheel->setMass(0.2);
d_wheel->setTotalAngle(4 * 360.0);
connect(d_wheel, SIGNAL(valueChanged(double)),
SLOT(scrollLeftAxis(double)));
// we need the resize events, to lay out the wheel
canvas()->installEventFilter(this);
#if QT_VERSION < 0x040000
QWhatsThis::add(d_colorBar,
"Selecting a color will change the background of the plot.");
QWhatsThis::add(scaleWidget,
"Selecting a value at the scale will insert a new curve.");
QWhatsThis::add(d_wheel,
"With the wheel you can move the visible area.");
QWhatsThis::add(axisWidget(xBottom),
"Selecting a value at the scale will insert a new curve.");
#else
d_colorBar->setWhatsThis(
"Selecting a color will change the background of the plot.");
scaleWidget->setWhatsThis(
"Selecting a value at the scale will insert a new curve.");
d_wheel->setWhatsThis(
"With the wheel you can move the visible area.");
axisWidget(xBottom)->setWhatsThis(
"Selecting a value at the scale will insert a new curve.");
#endif
}
void Plot::setCanvasColor(const QColor &c)
{
setCanvasBackground(c);
replot();
}
void Plot::scrollLeftAxis(double value)
{
setAxisScale(yLeft, value, value + 100.0);
replot();
}
bool Plot::eventFilter(QObject *object, QEvent *e)
{
if ( e->type() == QEvent::Resize )
{
const QSize &size = ((QResizeEvent *)e)->size();
if ( object == (QObject *)axisWidget(yLeft) )
{
const QwtScaleWidget *scaleWidget = axisWidget(yLeft);
const int margin = 2;
// adjust the color bar to the scale backbone
const int x = size.width() - scaleWidget->margin() + margin;
const int w = scaleWidget->margin() - 2 * margin;
const int y = scaleWidget->startBorderDist();
const int h = size.height() -
scaleWidget->startBorderDist() - scaleWidget->endBorderDist();
d_colorBar->setGeometry(x, y, w, h);
}
if ( object == canvas() )
{
const int w = 16;
const int h = 50;
const int margin = 2;
const QRect cr = canvas()->contentsRect();
d_wheel->setGeometry(
cr.right() - margin - w, cr.center().y() - h / 2, w, h);
}
}
return QwtPlot::eventFilter(object, e);
}
void Plot::insertCurve(int axis, double base)
{
Qt::Orientation o;
if ( axis == yLeft || axis == yRight )
o = Qt::Horizontal;
else
o = Qt::Vertical;
QRgb rgb = (uint)rand();
insertCurve(o, QColor(rgb), base);
replot();
}
void Plot::insertCurve(Qt::Orientation o,
const QColor &c, double base)
{
QwtPlotCurve *curve = new QwtPlotCurve();
curve->setPen(c);
curve->setSymbol(QwtSymbol(QwtSymbol::Ellipse,
Qt::gray, c, QSize(8, 8)));
double x[10];
double y[sizeof(x) / sizeof(x[0])];
for ( uint i = 0; i < sizeof(x) / sizeof(x[0]); i++ )
{
double v = 5.0 + i * 10.0;
if ( o == Qt::Horizontal )
{
x[i] = v;
y[i] = base;
}
else
{
x[i] = base;
y[i] = v;
}
}
curve->setData(x, y, sizeof(x) / sizeof(x[0]));
curve->attach(this);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -