(敬请注意:由于教程的编写时间已经过去好几年了,CChart库在这期间不断迭代,已经有了一定的变化,使得教程中的部分代码不能直接运行。为减小大家在使用中的困惑,教程已经根据最新版本进行了修订,所有示例程序修订后都测试通过。新版教程和例子源码在QQ群487856433和www.cchart.net网站均可下载。)
作为弱鸡鸭公司的产品,QT是非常强大的开发工具。可惜呀,在特级黑客盖茨先生种植的超级木马埃洛普老兄的大力折腾下,弱鸡鸭成功沦落为微软公司的小马仔,哎,三十年河东,三十年河西呀。
虽然弱鸡鸭沦落了,QT还是非常好用的,本节课笨笨给大家介绍CChart在QT下的使用要点。
需要指出的是,QT是一个跨平台的开发库,不过要是你的QT程序使用了CChart,就不要再指望跨平台了。CChart只能在Windows上使用,呵呵。
笨笨以前从来没有使用过QT,这里是现炒现卖,有问题大伙不要嘲笑我哟。
笨笨的最爱是VC6,据笨笨所知,支持VC6的最新QT版本是4.5.3,所以笨笨下载了QT4.5.3版本。
下面第一段是QT在VC6下配置方法,从网上同好处拷贝得来,这一段本来笨笨没有产权,但为了以后笨笨自我查询方便,还是放在这里。希望原作者不要来找笨笨的茬哟,呵呵。
A2.1 QT在VC6下的配置
1. 配置window下的QT运行环境
第一步:配置用户变量。
我的电脑,属性,高级,环境变量,用户变量。
首先新建名为:QTDIR的变量,变量值就是你的QT的安装目录,例如我的是:C:\QT\4.5.3。
再新建名为:QMAKESPEC的变量,变量值为:win32-msvc,这里就是设置你自己使用的编译器,如果在window下使用MinGw32,这个变量值就是win32-g++。由于我们使用的是VC6,当然不能是后一个啦。。
最后修改一下path变量的值:添加上QT中bin文件夹的路径,这里为安装好的qmake所在路径,使得命令行里面可以用qmake。例如我的是C:\Qt\4.5.3\bin,这里不同的值之间使用 ; 隔开的。
2. 生成VC可用的lib文件。
开始,运行输入cmd,打开控制台。
Cd命令转到QT的解压目录,我的是cd C:\QT\4.5.3,然后C:\QT\4.5.3>configure –help,查看一下configure的命令,我们需要的是C:\QT\4.5.3>configure –debug–and–release(debug和release是可选的,自己需要什么,自己看help的注释),然后选择“y”,同意,configure完成后,输入nmake,开始编译QT,这里是漫长的等待过程,时间视机器的性能而定。
OK,如果没有什么意外的话,QT已经配置成功。
A2.2 测试QT
下面我们先编制一个简单的程序看看QT是否还有问题。这个程序和CChart无关,纯粹是QT。
新建一个名为hello.cpp的文件,输入以下代码,保存。
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}
假设我们保存到C:\QT\4.5.3\Program\hello目录下。
为省事,笨笨做了一个批处理,用来编译这个文件。本节课的内容不使用VC6的IDE。
批处理文件名Compile.bat,文件内容如下。
Call "C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat"
qmake -project
qmake
nmake
这里第一行是建立VC编译的环境变量,第二行是生成QT的Pro文件,第三行生成makefile文件,第四行真正编译。
如果没有异常情况,在C:\QT\4.5.3\Program\hello目录会生成Debug目录和Release目录,里面有编译得到的Hello.exe文件。
OK,现在测试成功,CChart可以正式登场了。当然,如果不成功,还是回到前面看看吧,最好多联系联系度娘。
A2.3 CChart绘图
由于代码不长,下面直接给出整个代码,再稍加解释。
#include <QApplication>
#include <QWidget>
#include "Chart.h"
#if defined(_UNICODE) || defined(UNICODE)
# pragma comment(lib,"CChartu.lib")
#else
# pragma comment(lib,"CChart.lib")
#endif
using namespace NsCChart;
#pragma comment(lib,"user32.lib")
class PaintedWidget : public QWidget
{
public:
PaintedWidget();
protected:
void paintEvent(QPaintEvent *event);
CChartWnd m_ChartWnd;
};
PaintedWidget::PaintedWidget()
{
resize(800, 600);
setWindowTitle(tr("Paint Demo"));
m_ChartWnd.Attach((HWND)this->winId(), kTypeXY);
m_ChartWnd.GetChart()->AddPoint2D(1, 1);
m_ChartWnd.GetChart()->AddPoint2D(2, 2);
}
void PaintedWidget::paintEvent(QPaintEvent *event)
{
HWND hWnd = this->winId();
RECT rect;
GetClientRect(hWnd, &rect);
InvalidateRect(hWnd, &rect, TRUE);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
PaintedWidget w;
w.show();
return app.exec();
}
假定代码保存为Sample01.cpp文件中。
1、首先是QT头文件,CChart头文件和库文件包含,这些都是小儿科了。
注意这里包含了user32.lib文件,因为后面用到了它的函数。
2、接着我们建立了一个类PaintedWidget,继承于QWidget。这个类其实很简单,只有一个构造函数PaintedWidget();,一个函数void paintEvent(QPaintEvent *event);,和一个成员变量CChartWnd m_ChartWnd。
注意了,我们的CChart现在才正式登场。
3、下面在PaintedWidget的构造函数中初始化CChart。
这里QT中编程最关键的要点来了。看看这句代码。
m_ChartWnd.Attach((HWND)this->winId(), kTypeXY);
QT的Widget可以用winId()函数转换成Win32的HWND。这就是CChart能够在QT下使用的关键。
构造函数中的其它部分都没有什么特别的。
4、在paintEvent函数中,把QT的重绘动作转换成win32的WM_PAINT,方法就是InvalidateRect。这个函数包含在user32.lib中,所以前面有 #pragma comment(lib,"user32.lib") 这句话。
其实第四点也是一个关键,以前笨笨不是用InvalidateRect转换消息,而是直接调用CChart的OnDraw函数绘图,在QT中总是不能显示图像。
这其中的原因现在笨笨也不清楚,因为笨笨也是一个QT新手,好在问题解决了,也不用管到底是什么原因。糊里糊涂过一辈子其实也挺好的。
5、main函数,就不用解释了,反正所有的QT程序都差不太多。
6、代码已经解释完毕。现在还是扛起笨笨的屠龙宝刀——前面的Compile.bat,编译Sample01.cpp。
当然先还是得把CChart的9个库文件拷贝进来。
不出问题的话,会在Debug目录下生成Sample01.exe,这个文件默认链接了Plotdll_ud.lib。
把PlotDll_ud.dll拷贝到Debug目录下,运行Sample01.exe,效果如图。
欧耶!QT程序的效果和以前的程序一模一样,交互功能一点没少哟。