深入浅出CChart 每日一课——快乐高四第二课 富丽堂皇,没落贵族宝贵遗产之QT篇

(敬请注意:由于教程的编写时间已经过去好几年了,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程序的效果和以前的程序一模一样,交互功能一点没少哟。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值