Category Archives: Qt

Qt for VS c++ 2005 EE

Qt 4.3.2 已经支持 Visual Studio C++ 2005 Express Edition了,但不提供Integration,要使用的话,大概使用makefile project再加一点定制,比如使用qmake .pro来生成makefile,通过一些配置,Qt就可以使用VS这个稳定和强大的平台了(比如Intellisense, Debug等都比其它如Eclipse出色,毕竟是商业的)

To install it, download Qt 4.3.2 open source from its ftp at ftp.trolltech.com, configure it using a -platform win32-msvc2005, then compile/link by running nmake.

One thing to be noted is we have to install Windows Core SDK, IE SDK (If no IE SDK, prompting by missing shlwapi.h), and optionally MDAC SDK if you are going to install ODBC, prior to configure Qt. VC++ 2005 Express Edition does not come with SDK. We should install SDK seperately. One way is to install this package by appropriate customing.  

After installation, configure vcvar32.bat under "C:Program FilesMicrosoft Visual Studio 8Common7Tools" by adding "C:Program FilesMicrosoft Platform SDK for Windows Server 2003 R2Bin", "C:Program FilesMicrosoft Platform SDK for Windows Server 2003 R2Include",  and  "C:Program FilesMicrosoft Platform SDK for Windows Server 2003 R2Lib" to #path, #include and #lib respectively. Otherwise the compilation will complain it cannot find necessary header files.

完成了gimms-clip

作为了一个Qt的训练,主要是完成一个GIMMS数据集(ftp://ftp.glcf.umiacs.umd.edu/glcf/GIMMS/)的空间裁剪功能,特色在于:
  • Qt实现跨平台,国际化等功能
  • 调用GDAL完成多种GIS格式的转换
  • 可变线程来处理整个裁剪流程

完成了v1.0,可能暂时到止,以后有兴趣了,可以在此基础上再增加一些小功能,比如引进xml,将用户的配置记住等等(当然可以用QSettings,但锻炼一下学生的xml也是不错的)

放一个截图吧,已经本地化

 

——

前面有朋友问为什么在windows下不用mfc,我最早应该是mfc出身的,但接触的科研项目大多对操作平台有要求,国外很多学者仍是用linux/unix环境来进行科学研究,于是开始寻找一种可以跨平台的而且对于我来讲比较易学的工具(c/c++/c#背景),Qt当然是个不错的选择,只是Qt/win稍贵了一些

[原创]QTextCodec::codecForName()的问题

问题:
如下代码片断,
int main(…)
{
QTextCodec* gbkCodec=QTextCodec::codecForName("GBK");
Q_CHECK_PTR(gbkCodec);
 
QCoreApplication a(…);
 
 
return a.exec();
 
}
 
gbkCodec返回null。换成 除cn, jp, ko之外的编码,如 windows-1258,可以成功返回 codec! 如果不用codecForName,换成codecForLocale(),也将返回指向 System的codec,没有问题。检查codec plugins,确认有 qcncodecs.dll。
 
解决方案:
将 codecForName()一句移到 QCoreApplication a(…)一句之后。
 
原因不详。发现是内置的codec 这样是可以返回的,但plugin codec不能放在这个位置。
 
Environment: Qt 4.1.1

一个Qt Excel的文档翻译

使用Qt调用Excel

Eugene Eremin

翻译:tong # cngis.org

原文Urlhttp://www.qtlib.ru/index.php?option=com_content&task=view&id=42&Itemid=28

 

Qt 3.1及以上版本的一个新特性是为Windows操作系统提供了ActiveX支持。开发者如果关心如何使用Qt操作COM组件,比如在Excel里插入新数据,这个新增功能就很重要了。

然而不幸的是,在Internet上没有太多这方面的主题可以借鉴。我在这里演示一个例子,可能会对大家有所帮助。

首先我们来看一下Qt自带的例子。通常Qt自带的例子可以告诉大家一些常用的知识点。我不记得在哪里看过,说一个好的文档应当是用户看过后不再存在不解的地方。但Qt只提供了一个与MS Outlook Express交互的例子。不过这就是我开始Excel交互研究的起点了。

ActiveXCOM的区别不是很大,我不是这方面的专家,但我在这里推荐大家看一本Adam Denninga的书“ActiveX for professionals”。这本书会帮助大家很好地理解这些概念。第一步,我们来引入Excel,并创建一个对象。

#include <qaxobject.h>

QAxObject* excel = new QAxObject( "Excel.Application", this ); //获取一个Excel对象

excel->dynamicCall( "SetVisible(bool)", TRUE ); //设置为可见

这里我们通过代码构建了一个对象,并通过对象打开了Excel。第二步,我们计划插入新数据。为了做到这一步,必须了解一点Excel文档的结构。Excel应用程序包括一系列的workbooks,每个workbook又由多个sheets组成。Microsoft公司并没有给出太多这方面的结构信息,我在Google上寻找了不短的时间,也没有太多的结果。

QAxObject *workbooks = excel->querySubObject( "Workbooks" ); //得到Workbooks集合的指针

QAxObject *workbook = workbooks->querySubObject( "Open(const QString&)", "C:dataA.xls" ); //打开硬盘上的一个Excel文档

QAxObject *sheets = workbook->querySubObject( "Sheets" ); //得到Sheets对象的指针

QAxObject *StatSheet = sheets->querySubObject( "Item(const QVariant&)", QVariant("stat") );     //得到名为stat的一个sheet的指针

StatSheet->dynamicCall( "Select()" ); //选择名为statsheet使之可见 

QAxObject *range = StatSheet->querySubObject( "Range(const QVariant&)", QVariant( Qstring("A1:A1")));  //选择A1:A1这个range对象

range->dynamicCall( "Clear()" ); // 清除range对象

range->dynamicCall( "SetValue(const QVariant&)", QVariant(5) ); //将该range对象的值设为5

接下去用户可以保存和关闭这个Excel文档了。

最后说一句,这些对象的接口可以通过generateDocumentation () 产生。比如,我们可以这样做:

QFile outfile("excel.html");

QTextStream out( &outfile );

outfile.open( IO_WriteOnly | IO_Translate );

QString docu = excel->generateDocumentation();

out << docu;

outfile.close();

这些信息被保存在名为“excel.html”的文件里。如果插入的数据很大,会花费很多的时间。MFC使用了专门的class,但我没能在Qt里实现这个class。如果有意见,请反馈至http://prog.org.ru/forum/ptopic_141.html

译者注:本文由在线语言工具从俄语翻译至英语,然后人工翻译成中文,因此中文与俄文可能有一些出入,欢迎指正。

Qt 4里已经有很多的有关ActiveQt的文档,大家应当以那个为主要的学习的材料。

 

上周五早讨论时遇到的几个问题

1. olb?

*.olb可被认为是*.tlb的前身,它也是表述com对象的信息,现在已经被定义更完整的
*.tlb代替掉了,使用*.olb的ocs/activeX一般是较为早期的产品。

2. axWidgetTOC->dynamicCall("SetBuddyControl(IDispatch*)",
(axWidgetPageLayout->querySubObject("Object"))->asVariant());

Object是PageLayout的一个属性。querySubObject输入方法名或属性名。
HRESULT IPageLayoutControl2::get_Object(
IDispatch** ppDispatch
);

3. catalog open file dialog

GxDialog在ArcEngine里不能用。这里有个帖子讨论这个问题:
http://forums.esri.com/Thread.asp?c=159&f=1705&t=163159&mc=5
这里有个例子,也可以参考
http://edndoc.esri.com/arcobjects/9.0/default.asp?URL=/arcobjects/9.0/Sample
s/Geodatabase/Accessing_Data/Browse_for_data_using_name_objects/Browse_for_d
ata_using_name_objects.htm

4. Q_Declare_private / d_func()
目的是为了在类里隐藏界面冗长的代码,将界面代码放置到专设的 QxxxPrivate类里
去。相关的定义如下:
#define Q_DECLARE_PRIVATE(Class)
inline Class##Private* d_func() { return reinterpret_cast<Class##Private
*>(d_ptr); }
inline const Class##Private* d_func() const { return
reinterpret_cast<const Class##Private *>(d_ptr); }
friend class Class##Private;

#define Q_DECLARE_PUBLIC(Class)
inline Class* q_func() { return static_cast<Class *>(q_ptr); }
inline const Class* q_func() const { return static_cast<const Class
*>(q_ptr); }
friend class Class;

#define Q_D(Class) Class##Private * const d = d_func()
#define Q_Q(Class) Class * const q = q_func()

在使用时,
//////////////////////
class QDialogPrivate;

class Q_GUI_EXPORT QDialog : public QWidget
{
Q_OBJECT
Q_DECLARE_PRIVATE(QDialog)
///////////////////////
class QDialogPrivate : public QWidgetPrivate
{
Q_DECLARE_PUBLIC(QDialog)
public:
///////////////////////
d_ptr是在QObject里定义的,protected,为指向 QObjectData的指针
p_ptr是在QObjectData里定义,public,指向QObject的指针
在使用时,定义Q_D(class)和Q_Q(Class),直接使用 d和q两个指针

QHttp post的一个问题

有一些网站必需要求 cookies,这些在使用QHttp request前,必须在
QHttpRequestHeader里设置 正确的cookies,否则可能不正常工作,in the
citationSearch case,会提示被禁止访问。具体作法可参考 citationSearch源代码。

1. 可以在程序里 实例化多个 QHttp

2. 最好用 requestFinished(int, bool)来截获请求的完成情况,而不是done(bool);在进行abort()或delete QHttp时,都要emit done

3. …

Qt 4.1

我只是想告诉大家Qt 4.1 /win commercial desktop现在网上已经可以找到下载的,至
于在哪里,用google自己耐心找去吧。发现Russia真是D版的很厉害
for vs integration 1.1,现在支持 vs.net 2k5了,不过没试
从介绍看,4.1改进了很多内容,但好象对paint的更改不大,据说在4.2里才改进,其
实我们是比较关心这个了

改进的图像校验码生成算法和辅助工具

*******************************************
目的
*******************************************
生成图像校验码

*******************************************    
内容           
                               

*******************************************
包括改进的asp图像检验码生成程序,和一个生成body.fix和head.fix的
辅助工具。该辅助工具基于Qt 4开发,基于GNU/GPL协议(请阅读GPL.txt
文档)。附源码。

*******************************************    
USAGE                                        

*******************************************
1. 制作0.bmp, 1.bmp等10张数字图片,并以0.bmp, 1.bmp这样的规律命名
2. 将图片放在images目录下
3. 运行tool.exe
4. 选定“生成Body.fix”,单击“运行”
5. 选定“生成head.fix”,指定检验码位数,宽度和高度是由上一步骤自动
读取得到,如果正确,保持不变。单击“运行”
6. 这时得到body.fix和head.fix,退出。
7. 用文本编辑器打开 valCode_new.asp,修改digit_width、digit_height、
digit_num 这三个参数,使之与以上步骤使用的参数一致
8. 将test.html, valCode_new.asp, body.fix, head.fix,以及blank.bin
五个文件复制到IIS虚拟目录下
9. 在浏览器里浏览test.html,就可以得到预想效果

NOTE: images目录下已经放了示例数字图片。注意每个图片大小必须严格一
致。将valCode_new.asp整合到某一web程序时,可以使用
Session("ValidationCode")对request值进行检验。

*******************************************
FILE LIST
*******************************************

blank.bin
body.fix      
head.fix      
images         <dir>
msvcp71.dll   
msvcr71.dll   
numCode.asp   
QtCore4.dll   
QtGui4.dll    
README        
src            <dir>
test.html     
tool.exe      
tool_zh.qm    
valCode_new.asp

images
0.bmp
1.bmp
2.bmp
3.bmp
4.bmp
5.bmp
6.bmp
7.bmp
8.bmp
9.bmp

src
GPL.txt
main.cpp
tool.cpp
tool.h 
tool.ico
tool.pri
tool.pro
tool.ui          

*******************************************    
CREDIT                                       

*******************************************
valCode_new.asp在BlueIdea.COM Web Team V37 2003-7-25工作的基础
改善完成(所附的numCode.asp是原文件)。
Qt是Trolltech的trademark。

在qt里实现access数据库的compact和repair

增加2个#import,
#import "C:Program FilesCommon FilesSystemadomsado27.tlb" no_namespace rename("EOF","adoEOF")
#import "C:Program FilesCommon FilesSystemadomsjro.dll"
增加从QString到BSTR的转换函数
static inline BSTR QStringToBSTR(const QString &str)
{
 return SysAllocStringLen((OLECHAR*)str.unicode(), str.length());
以下主要代码,注意在srcConnection和desConnection不能指向同一个数据源。
//compact the db
 JRO::IJetEnginePtr jet(__uuidof(JRO::JetEngine));
 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 QString srcConnection=QString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%1;")
  .arg(dbqPath);
 QString desConnection=QString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%1;")
  .arg(dbqPath+".tmp");
 jet->CompactDatabase(QStringToBSTR(srcConnection), QStringToBSTR(desConnection));
 bool renameError=false;
 if ( !QFile::rename(dbqPath, dbqPath+"k")) renameError=true;
  
 if (!QFile::rename(dbqPath+".tmp", dbqPath)) renameError=true;
    QApplication::restoreOverrideCursor();