您的位置:首页 > 编程语言 > Qt开发

基于Qt绘制科学图表 -- Qwt试用

2012-07-29 21:52 302 查看

Qwt是一个基于LGPL版权协议的开源项目, 其目标是提供一组2D的窗体库显示技术领域的数据, 数据源以浮点数组或范围的方式提供, 输出方式可以是Curves(曲线),Slider(滚动条), Dials(圆盘), compasses(仪表盘)等等。 该工具库基于Qt开发, 所以也继承了Qt的跨平台特性, 据原作者文档所说, 该项目在Qt-win/Qt-x11/Qt-embedded(qvfb环境)上都测试过, 运行正常。 项目的主页在:

在网上搜了一下, 发现关于qwt的中文资料实在很少, 基本上只有关于编译和安装的文章。 实际上经过笔者实践, Qwt的编译和运行实在乏善可陈, qmake;make就可以搞定, 没什么可memo的东西, 所以这篇文章将以扫盲为主, 介绍Qwt的feature。

当然按照正常的顺序, 我们还是从编译安装开始。 从svn服务器上下载最新代码:

svn co https://qwt.svn.sourceforge.net/svnroot/qwt/trunk/qwt

进入qwt目录, 运行你电脑上qt4对应的qmake, 再运行make编译。如笔者环境中是

$ cd qwt

$ export PATH=/usr/local/Trolltech/Qt-4.5.1/bin/:$PATH

$ qmake

$ make

编译要花个几分钟的时间。 成功后在lib下会生成 libqwt.so*文件, 并且examples也参与编译, 生成的binary在examples/bin下, 我们可以运行这些例子初步查看qwt的功能。

$export LD_LIBRARY_PATH=$PWD/lib

$cd examples/bin

$ ./simple

simple是qwt自带的例子中最简单的一个, 一共只有一百来行的代码, 实现了数学中的正弦函数(sin())和余弦函数(cos())曲线。 如下图:

01


这个例子里用到的核心类有四个(以下内容是笔者的理解, 有可能有不对的地方, 请酌情阅读):

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的优越性。 再来几个例子的截图:









篇二

现在看到的本文已经是第三版,写这篇博文的起初原因是本菜菜最近准备使用Qwt开发一些功能部件,而公司里基本是使用win Xp系统进行开发工作,为了便于日后的团队开发,所以研究了怎么将qwt库和QtCreator整合起来。但是由于不是很严谨的态度,但随便的实验感觉成功后,感觉整合没问题后,就轻松地写了篇博文,幸亏由于shiroki大姐的指出,才发现许多不足,甚至是严重的错误会误导别人。通过双休日的不懈努力和研究,总算实验成果,并且证实了本菜菜的思路,而且对于Qt更加了解,对以前缺少的知识点也得到了补足,这个内容么,也真正做到的浅入深出。在基于Qt绘制科学图表
-- Qwt试用中,shiroki大姐介绍了怎么样在linux下安装qwt,并使用qwt,本菜菜经过在winXp操作系统下的不断尝试,发现能快速地使用Qt Creator进行编译,而在开发程序时也能使用Qt Creator进行,故详细地介绍给大家。首先确定你使用的是winXP操作系统,并且已经安装了Qt SDK for windows,如果没有安装,可以去Qt官方网站下载安装包安装,安装的过程十分简便,跟普通的windows的EXE安装包没有太大区别,指定好路径,一路next就可以安装,在安装完成后,也无需设置环境变量即可使用来编写编译Qt程序。安装完毕后,即可使用QtCreator,然后去下载qwt的源代码,目前的版本为qwt-5.2.0,在前面文章中提供过项目主页地址,在项目主页地址下可以选择下载对应linux的tar源码压缩包或者对应win的zip源码压缩包,我们选择的自然是zip压缩包,然后下载完成后,解压在英文路径下的目录即可。有了Qt
SDK,qwt的编译过程自然就变得简单无比了,环境变量啊,Qt的lib库啊,一切都有Qt SDK帮助,这就是为什么是我想说傻瓜式安装qwt的原因。相比以前的编译,安装和设置环境变量,使用Qt Creator可以帮助简化步骤。打开Qt Creator,打开qwt源码目录下的.pro工程文件,然后点击左下的run按钮,qwt就开始了自动编译的的过程: 编译过程需要5到10分种时间,可以坐下别的事,或者喝杯咖啡什么的

在上篇中,介绍了如何使用QtCreator编译安装qwt,现在介绍怎么使用QtCreator来编写使用了qwt库的qt程序。为了简化流程,本菜菜直接复制了qwt中example的代码,并且使用QtCreator新建一个工程并将代码粘贴进去。这时如果误以为只要点击run就可以运行程序,那就是大错特错了。本菜菜开始时就犯了如下的错误,不幸的是,是直接使用了qwt目录里的example,而里面的pro工程文件可是设置完毕的,只要生成了库文件dll和libxx.a的文件情况下,自然是可以运行的。本菜菜就是这样被蒙蔽了,才造成qwt库设置完毕的假象。
这时如果点击run,多半会出现以下错误: 简单地来说,就是QtCreator找不到qwt库中各个类型的声明。解决的办法也很简单,将qwt的头文件包含进去即可。去qwt的解压目录,在下面有个src目录,里面就有所有qwt的源码文件,将其中的.h头文件复制出来,然后去Qt SDK的安装目录,在下面的qt子目录的include目录里(比如F:\Qt\2009.03\qt\include)新建一个Qwt文件,将复制出来的.h文件粘贴进去。 Qwt毕竟是第三方库,指望QtCreator能自动认出来,还需要在.pro里文件设置LIBS和INCLUDEPATH
,这些属于qmake的知识范畴内,有兴趣的朋友可以去看看文档qmake手册部分:http://qt.nokia.com/doc/4.5/qmake-manual.html.

本菜菜的设置如下: LIBS += -L”f:/Qt/2009.03/qt/lib” -lqwt5 INCLUDEPATH += f:/Qt/2009.03/qt/include/qwt

各人设置爱好都不一样,大家可以根据自己的需求来设置。上面这些步骤浓缩起来时很简单,但在一无所知地情况下,本菜菜花费了大量的时间来尝试,可谓步步都留下辛勤的汗水。恐怕很多在想了,现在总可以正常使用qwt了吧,好吧,我也是这样想的,结果却是: 真是很郁闷的错误啊,然后又花费了大量的时间进行研究,原因其实也很简单,在winXP下面,Qt是不能混用库的。在QtCreator下面,默认编译运行的是debug模式,而本菜菜编译出来的是release库,自然就不行了。这时设置QtCreator为release模式,就能运行程序,但这样,调试怎么办了?当然,只要编译qwt生成debug库文件,自然就可以在QtCreator下使用debug模式编译使用。这是,去qwt的源码目录,打开qwtconfig.pri文件,可以使用记事本,

也可以使用类似UltraEdit的软件工具,在里面找到这段:

win32 { # On Windows you can’t mix release and debug libraries.

# The designer is built in release mode. If you like to use it

# you need a release version. For your own application development you

# might need a debug version.

# Enable debug_and_release + [...]

在上和中篇中,通过一些列简单的配置,我们可以方便在WinXP上编译安装Qwt库,并且对pro文件作少需修改,就可以顺利的使用Qwt库开发程序。对于习惯敲代码的人来说,到这步已经足以满足开发的需求,但对于要求快速应用开发或者是习惯于Qt设计器的开发人员来说,这还远远不够。细心的人可能会觉得,前面把库文件复制过去了,不是应该已经集成到了Qt设计器里么。这样想的人可以说,对于Qt SDK是不甚了解,Qt SDK是由两部分组成,Qt Creator 和Qt
库,没有Qt Creator,照样能使用Qt库写程序,没有了Qt库,Qt Creator可干不了什么。在上中,我做的紧紧是把Qwt库集成到了Qt库中,如果启动Qt的库的设计器,自然就能看到旁边可选择得Qwt部件,而在QtCreator的设计器中,是不会出现Qwt的部件。 以此类推,解决的办法就是讲Qwt插件文件复制到QtCreator的bin目录下去,如我就是F:\Qt\2009.03\bin\designer。假如这能一次性成功,那该是多么好的事情,现实是残酷的,QtCreator中的设计器显示该插件无法加载,而错误信息显示:

“The plugin uses incompatible Qt library. Expected build key “Windows msvc relase full-config”, to “Windows mingw release full-config”.

明明Qt库是用mingw编译,为什么会出现msvc编译器呢?于是仔细查找了有关资料,发现以下这段话:

The version of QT Creator shipped with the QT SDK Open Source version for windows is build using Visual Studio, whereas the SDK is build with and supports g++ (MinGW). This [...]

篇三

) Win32/MinGW Qt4

==================

C1) Windows Shell

Start a Windows Shell, where Qt4 is initialized. ( F.e. with

"Programs->Qt by Trolltech ...->Qt 4.x.x Command Prompt" ).

qmake qwt.pro

make

If you didn't enable autobuilding of the examples in qwtconfig.pri

you have to build the examples this way:

cd examples

qmake examples.pro

make

make install

篇四

cd path

qmake qwt.pro

mingw32-make

mingw32-make install
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: