Qt:QWT类的一些使用方法

QWT类的一些使用方法

QwtPlot
类似一个2D绘图的容器, 里面可以放其他的QwtPlotItem派生类对象, 比如本例子中使用的QwtPlotMarker等。(有点类似Qt里的graphicsview的感觉。) 这个类负责控制绘图数据的产生和传递, 并且绘制一个坐标轴。
QwtPlotMarker
标尺类, 用于绘制刻度线。
QwtPlotCurve
曲线类, 用于绘制各种曲线。
QwtSyntheticPointData
比 较奇怪, 这是个undocumented的类, 估计不小心被作者遗漏了, 文档中没有提供该类的说明, 只能从源码中寻找答案了, 这一点很让人郁闷。 通过看code当中的注释和例子代码, 笔者的理解是该类负责产生数据, 它的作用是提供固定数量的浮点数的点, 点的数量在构造类时传入。 获取数据时QwtPlotCurve类会调用该类的y()方法获取纵坐标。

程序的基本流程是:
1、初始化绘图容器, 设置坐标轴的参数
// Set axes
setAxisTitle(xBottom, “x –>”);
setAxisScale(xBottom, 0.0, 10.0);//横坐标从0到10, xBottom表示横坐标的方向从下往上

setAxisTitle(yLeft, “y –>”);
setAxisScale(yLeft, -1.0, 1.0); //纵坐标-1到1,yLeft表示纵坐标的方向从左到右

2、添加正弦余弦曲线
// Insert new curves
QwtPlotCurve *cSin = new QwtPlotCurve(“y = sin(x)”);

if QT_VERSION >= 0×040000

cSin->setRenderHint(QwtPlotItem::RenderAntialiased);

endif

cSin->setPen(QPen(Qt::red));//红色曲线
cSin->attach(this);

QwtPlotCurve *cCos = new QwtPlotCurve(“y = cos(x)”);

if QT_VERSION >= 0×040000

cCos->setRenderHint(QwtPlotItem::RenderAntialiased);

endif

cCos->setPen(QPen(Qt::blue));//蓝色曲线
cCos->attach(this);

3、设置曲线的数据内容
// Create sin and cos data
cSin->setData(FunctionData(::sin));
cCos->setData(FunctionData(::cos));

4、添加横纵标尺线作为坐标的参照
// Insert markers
// …a horizontal line at y = 0…
QwtPlotMarker *mY = new QwtPlotMarker();
mY->setLabel(QString::fromLatin1(“y = 0″));
mY->setLabelAlignment(Qt::AlignRight|Qt::AlignTop);
mY->setLineStyle(QwtPlotMarker::HLine);//线的方向
mY->setYValue(0.0);//标尺线画在y=0的位置
mY->attach(this);

// …a vertical line at x = 2 * pi
QwtPlotMarker *mX = new QwtPlotMarker();
mX->setLabel(QString::fromLatin1(“x = 2 pi”));
mX->setLabelAlignment(Qt::AlignLeft | Qt::AlignBottom);
mX->setLabelOrientation(Qt::Vertical);
mX->setLineStyle(QwtPlotMarker::VLine);
mX->setLinePen(QPen(Qt::black, 0, Qt::DashDotLine));
mX->setXValue(2.0 * M_PI);//该标线画在x=2PI的位置
mX->attach(this);

同样的功能如果用Qt来写的话需要写大量的绘图代码, 比较麻烦, 但使用Qwt的封装库代码更OO且更容易理解和维护。 在这个例子中使用Qwt的优势体现得可能还不太明显, 相比而言复杂一些的图表更能体现Qwt的优越性。 再来几个例子的截图:
bode

histogram

cpuplot

oscilloscope
鼠标滚轮放大缩小:

QwtPlotMagnifier *PM = new QwtPlotMagnifier( ui->qwtPlot->canvas() );

鼠标左键拖动波形:

QwtPlotPanner *PQ= new QwtPlotPanner( ui->qwtPlot->canvas() );

鼠标左键选择区域放大:(右键还原)

QwtPlotZoomer* zoomer = new QwtPlotZoomer( ui->qwtPlot->canvas() );
zoomer->setRubberBandPen( QColor( Qt::black ) );
zoomer->setTrackerPen( QColor( Qt::black ) );
zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier );
zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton );

设置X轴下面标识:

ui->qwtPlot->setAxisTitle(QwtPlot::xBottom, "x -->" );

设置X轴取值范围:

ui->qwtPlot->setAxisScale(QwtPlot::xBottom, 0.0, 30.0);

设置Y轴左边标识(竖着显示):

ui->qwtPlot->setAxisTitle(QwtPlot::yLeft, "y -->");

设置Y轴取值范围:

ui->qwtPlot->setAxisScale(QwtPlot::yLeft, -1.0, 1.0);

创建一个sin()曲线:

QwtPlotCurve *cSin = new QwtPlotCurve("y = sin(x)");
cSin->setRenderHint(QwtPlotItem::RenderAntialiased);
cSin->setLegendAttribute(QwtPlotCurve::LegendShowLine, true);
cSin->setPen(QPen(Qt::blue));
 cSin->attach(ui->qwtPlot);
cSin->setData(new FunctionData(::sin));

其中FunctionData为:
class FunctionData: public QwtSyntheticPointData { public: FunctionData(double(*y)(double)):QwtSyntheticPointData(100), d_y(y) { } virtual double y(double x) const { return d_y(x); } private:double(*d_y)(double); };

class FunctionData: public QwtSyntheticPointData
{
public:
    FunctionData(double(*y)(double)):
        QwtSyntheticPointData(100),
        d_y(y)
    {
    }
    virtual double y(double x) const
    {
        return d_y(x);
    }
private:
    double(*d_y)(double);
};

创建波形标识:(Y=0) QwtPlotMarker *mY = new QwtPlotMarker(); mY->setLabel(QString::fromLatin1(“y =0”)); mY->setLabelAlignment(Qt::AlignRight|Qt::AlignTop); mY->setLineStyle(QwtPlotMarker::HLine); mY->setYValue(0.0); mY->attach(ui->qwtPlot);

QwtPlotMarker *mY = new QwtPlotMarker();
    mY->setLabel(QString::fromLatin1("y = 0"));
    mY->setLabelAlignment(Qt::AlignRight|Qt::AlignTop);
    mY->setLineStyle(QwtPlotMarker::HLine);
    mY->setYValue(0.0);
    mY->attach(ui->qwtPlot);

创建波形标识:(X=PI/2) QwtPlotMarker *mX = new QwtPlotMarker(); mX->setLabel(QString::fromLatin1(“x =PI/2”)); mX->setLabelAlignment(Qt::AlignLeft | Qt::AlignBottom); mX->setLabelOrientation(Qt::Vertical);mX->setLineStyle(QwtPlotMarker::VLine); mX->setLinePen(QPen(Qt::black, 1, Qt::DashDotDotLine)); mX->setXValue(M_PI/2); mX->attach(ui->qwtPlot);

QwtPlotMarker *mX = new QwtPlotMarker();
    mX->setLabel(QString::fromLatin1("x = PI/2"));
    mX->setLabelAlignment(Qt::AlignLeft | Qt::AlignBottom);
    mX->setLabelOrientation(Qt::Vertical);
    mX->setLineStyle(QwtPlotMarker::VLine);
    mX->setLinePen(QPen(Qt::black, 1, Qt::DashDotDotLine));
    mX->setXValue(M_PI/2);
    mX->attach(ui->qwtPlot);

设置qwtPlot的画布:(圆角矩形) ui->qwtPlot->canvas()->setLineWidth( 1 ); ui->qwtPlot->canvas()->setFrameStyle( QFrame::Box | QFrame::Plain ); ui->qwtPlot->canvas()->setBorderRadius( 15 );

ui->qwtPlot->canvas()->setLineWidth( 1 );
    ui->qwtPlot->canvas()->setFrameStyle( QFrame::Box | QFrame::Plain );
    ui->qwtPlot->canvas()->setBorderRadius( 15 );

设置qwtPlot的画布:(白色填充) QPalette canvasPalette( Qt::white ); canvasPalette.setColor(QPalette::Foreground, QColor( 133, 190, 232 ) ); ui->qwtPlot->canvas()->setPalette( canvasPalette );

QPalette canvasPalette( Qt::white );
    canvasPalette.setColor( QPalette::Foreground, QColor( 133, 190, 232 ) );
    ui->qwtPlot->canvas()->setPalette( canvasPalette );

设置整个界面的颜色: QPalette pal = palette(); const QColor buttonColor = pal.color( QPalette::Button );QLinearGradient gradient( 0, 0, 0, 1 ); gradient.setCoordinateMode( QGradient::StretchToDeviceMode );gradient.setColorAt( 0.0, Qt::white ); gradient.setColorAt( 0.7, buttonColor ); gradient.setColorAt( 1.0,buttonColor ); pal.setBrush( QPalette::Window, gradient ); setPalette( pal );

    QPalette pal = palette();
    const QColor buttonColor = pal.color( QPalette::Button );
    QLinearGradient gradient( 0, 0, 0, 1 );
    gradient.setCoordinateMode( QGradient::StretchToDeviceMode );
    gradient.setColorAt( 0.0, Qt::white );
    gradient.setColorAt( 0.7, buttonColor );
    gradient.setColorAt( 1.0, buttonColor );
    pal.setBrush( QPalette::Window, gradient );
    setPalette( pal );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值