| Zhuotong's profile苦楝树BlogListsNetwork | Help |
|
|
4/9/2009 qt4与fortran 90的连接面临的问题是fortran与qt4联编,在qt/c++代码里要访问fortran的4个函数,和很多的数据结构。在c++里全部用extern “C”暴露出来。作了compiler specific的函数名和变量名调整。 试了G95编译fortran代码,与gcc v3进行连接,在传递数组指针时出现问题,疑是编译器级别的问题,无法解决。 找了gfortran,在新版的mingw gcc 4里已经集成里面,重新配置了mingw,安装包如下: binutils-2.19.1-mingw32-bin 先用gfortran编译了三个f90文件,生成 .o文件,如 gfortran –c module_sf_noahlsm.f90 然后在qt4 pro文件里添加, OBJECTS += ./module_model_constants.o \ 在LIBS里也需要添加 –lgfortran qt4编译连接国;过,加载数据测试无误。实现了fortran 90与qt4的一种连接。当然不是最好的方式,有见人在讨论版上说通过修改qt4 spec文件实现直接在pro里添加.f90,调用gfortran直接进行编译,然后相连。这当然是最好的,但对于一般用途,上述方式也足够。 1/14/2009 Qt 4.5将以LGPL发布转帖一个有关Qt的信,绝对天大的好消息,Qt 4.5版本会以LGPL发布。这样大家可以放心用于商业用途,而无需关心版权的问题了。Nokia还是财大气粗呀。 Dear Qt User: 1/3/2009 Qt编程最佳实践21项(一)C. Probst, Oct 2008 来自ICSNetwork视频,Zhuotong Nan(zhn1@pitt.edu) 整理。原视频地址:http://www.ics.com/learning/icsnetwork_webinar/flash/8 最佳实践1,动手写代码前 实现一个任务前,先翻一下例子程序,Qt solutions(Qt提供的一些解决方案库,有商用也有开源的),Trolltech(Qt的开发商,现在被Nokia收购)及其合作伙伴提供的解决方案,以及开源项目等。 可能有一些与你的需求类似的项目已经存在,另外Qt提供的例子程序值得一看,一般例子程序都演示了比较好的实现方式。在使用这些已有代码前,请检查许可条件,比如是不是GPL,还是商用的,要与你的项目保持一致。 最佳实践2,调查Qt提供的其它模块和框架 除了GUI(图形用户界面)编程支持,Qt还提供了支持一些关键技术的独立于平台的其它API,比如多线程、网络、XML、图形、OpenGL、SQL等。 你需要实现的功能已经可能包括在这些模块里,仔细阅读文档,Qt有很好的文档,从中可以得到你关心的信息。 最佳实践3,了解qmake qmake可以极大简化编译过程。使用qmake -project也可以产生很多项目文件。它可以生成makefile,nMake makefile等。同时也支持生成visual c++, vs .net, MacOS Xcode项目文件。 但同时也需要认识到qmake在操作大而复杂的项目(比如涉及不同的编译器,相互连接)时可能会有一些限制,这时可以试试比如cmake等。 最佳实践4,用new创建QObject并且指定一个父指针 除非你明确你创建的对像的生命周期只限制在这个生成对像的方法中,否则都用new对创建一个从QObject派生出来的对像,并且指定一个父指针。这样不至于代码在离开这个方法时,就销毁了这个对像,而这往往不是你期望的。 指定一个父对像指针,当这个父对像被销毁时,这个对像也自动被销毁。 保证全部的QObject对像都有一个父对像,这样确保全部的QObject对像最终都可以被销毁。 一个例子, QLabel aLabel(this); QLabel* aLabel =new QLabel(this); 最佳实践5,不要多重继承QObject 不要从QObject或其子类上多重继承,Qt不支持这种方式。 最佳实践6,了解QDialog::exec()和QWidget::show()的区别 刚学习Qt时可能会混淆这两者,两者有类似的作用,但也有显著的区别。QWidget::show()将widget(QDialog是QWidget的子类)和它的子对像显示出来;QDialog::exec()是一种有模显示方式,也是将其和子类显示出来,但这时用户除非关闭这个对话框,不能与其它窗体交互。 QWidget类是用户界面类的子类;QDialog也是从QWidget上派生出来的,用于获取用户输入的数据。 最佳实践7,在写定制的图形控件时,确保没有现成的已经存在 Qt里的全部GUI对像,事实上都是定制的控件,与用户自己写的没啥区别。Qt已经提供了很多有用的控件,比如QCalendar、QTooltip、QTabWidgets、QDateEdit、QTimeEdit等。如果已经有现成的,尽量用它们,毕竟它们经过了完整的测试。 写一个定制的控件时,需要重实现QPaintEvent,以及使用QPainter类。 当然,如果你需要的控件是独一无比,除了自已写就别无选择了。不过需要注意写控件是不容易的,需要小心的设计和大量的努力。 (待续) 6/12/2008 Qt 4.4 + msvc2005 下安装Eric 4, a python IDE下载了Qt 4.4.0开源,指定msvc2005 spec,编译了大概2小时完成。 下载python 2.5.2 msi安装。下载SIP v4.7.6,根据readme.txt安装,指定-p win32-msvc2005。下载QScintilla-gpl-2.2.zip,根据readme.txt安装,安装for Qt4。 下载PyQt v4.4.2,运行c:\python25\python configure.py时,提示fromAscii_helper@QString@@CAPAUData@1@PBH@Z could not be loacated in the dynamic link library QtCore4.dll,原因是在path环境变量里,在c:\qt-4.4.0\bin前还有个路径C:\Program Files\MATLAB\R2007b\bin有老版本的QtCore4.dll。将c:\qt-4.4.0\bin移到MATLAB前解决此问题。 安装QScintilla2 for Python binding(在源文件Python下),见doc\html-Qt4\index.html。此步骤须在安装PyQt后,否则提示找不到PyQt v4。 将qscintilla2.dll从%QTDIR%\lib拷贝到%QTDIR%\bin目录下。 下载eric4-4.1.5,c:\python25\python install.py,安装之。 涉及到较多的开源包,一般安装步骤都是: c:\python25\python configure.py 注: QScintilla-gpl-2.2的python binding生成的Makefile好像有问题,产生link error,可能原因是没有定义-DQSCINTILLA_DLL。可以打开configure后产生的Makefile,在CPPFLAGS里增加此定义。 可以下载QScintilla-gpl-2.2.1-snapshot-20080610,此问题已经更正。 好一阵折腾呀! 11/29/2007 Qt integration for Eclipse Trolltech finally organized technicals to develop integration with Eclipse, the popular C++ development environment in open source community. A version of 1.0 RC2 has come out and can be found from Trolltech offical FTP server at ftp.trolltech.com. I tried this integration tool to develop a small console tool. It features some interesting things. But it is not very stable yet. Hope 1.0 release version will be more stable and more user friendly. 11/27/2007 Qt for VS c++ 2005 EEQt 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. 5/11/2006 [原创]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 3/28/2006 一个Qt Excel的文档翻译使用Qt调用ExcelEugene Eremin 翻译:tong # cngis.org 原文Url:http://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交互研究的起点了。 ActiveX和COM的区别不是很大,我不是这方面的专家,但我在这里推荐大家看一本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:\\data\\A.xls" ); //打开硬盘上的一个Excel文档 QAxObject *sheets = workbook->querySubObject( "Sheets" ); //得到Sheets对象的指针 QAxObject *StatSheet = sheets->querySubObject( "Item(const QVariant&)", QVariant("stat") ); //得到名为stat的一个sheet的指针 StatSheet->dynamicCall( "Select()" ); //选择名为stat的sheet,使之可见 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的文档,大家应当以那个为主要的学习的材料。
3/26/2006 上周五早讨论时遇到的几个问题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两个指针 2/21/2006 QHttp post的一个问题有一些网站必需要求 cookies,这些在使用QHttp request前,必须在 1. 可以在程序里 实例化多个 QHttp 2. 最好用 requestFinished(int, bool)来截获请求的完成情况,而不是done(bool);在进行abort()或delete QHttp时,都要emit done 3. ... 1/3/2006 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里才改进,其 实我们是比较关心这个了 9/13/2005 改进的图像校验码生成算法和辅助工具******************************************* 目的 ******************************************* 生成图像校验码 ******************************************* 内容 ******************************************* 包括改进的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。 9/8/2005 在qt里实现access数据库的compact和repair增加2个#import,
增加从QString到BSTR的转换函数
以下主要代码,注意在srcConnection和desConnection不能指向同一个数据源。
9/6/2005 如何在Qt里获取环境变量? //get environment variable QString s=getenv("CommonProgramFiles"); //qDebug()<<"pmTools::getDbqPath(), s="<<s; 这是标准C函数,Qt里不再提供类似函数。 9/3/2005 如何在Qt程序里关闭另一个程序?好象Qt是没有提供好的方案了。 (1)另一个程序在运行时,在某个地方写一些特殊的东西,Qt程序可以根据这些特殊的 东西进行判断该程序是否正在运行。正如qtcn群上一位同志讲的,如果该程序没有正常 退出的话,Qt程序的判断就会有问题。此外,这种solution的一个前提是Qt程序和该程 序都应该是有源码可以修改的。一个好处是绝对是cross platform的。 (2)应用独立于platform的代码。比如可以用win32 api来枚举进程,但问题是相对比较 复杂,比如在winxp和nt上的枚举相关api都不一样,在linux, mac等平台上的实现更是 不容易。 (3)msdn上给出一种相对简便的方法(http://support.microsoft.com/?kbid=153463), 也是应用win32 api。先使用findWindow,输入窗口的title,得到该程序的handler, 然后向应用postMessage向该程序发送WM_QUIT(eggheadcafe.com上有人建议用 WM_CLOSE (http://support.microsoft.com/default.aspx?scid=kb;en-us;178893)),来关闭该 程序。缺陷,一个也是独立于平台的,另外一个,应用FindWindow,不排除有窗口 title相同的程序,这样返回的handler未必正确。 9/2/2005 qDebug()引起的一连串free溢出调用类似 qDebug()<"main(), db.dbConnect() ="<<db.dbConnect(); 引起程序在关闭的时候,free.c内存溢出。 qDebug doc讲,在一些平台,如果输入const char* =0的时候,可能crash掉 但现在不是这个问题, 最后发现原因是 在连接的时候输入库写成 release版本了,选择对应的debug版本就ok了(QtSql4.lib->QtSqld4.lib)。 此为记! QODBC/Qt4调试了很长时间,总是提示说“数据源名称过长”,后来发现问题出在将connStr里的 DRIVER写成Driver了 Qt的ODBC好象对大小写敏感,所以一定要根据DSN里的原样copy过来。 bool UserSoils::connectDb() { //create default conn using assigned dbPath
}QString connStr=QString( "DRIVER={Microsoft dBASE Driver (*.dbf)};FIL={dBase 5.0};DBQ=%1") .arg(dbPath());
//for access//QString connStr=QString( // "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=c:\\xxxx.mdb"); qDebug()<<"UserSoils::connectDb(), connStr ="<< connStr; QSqlDatabase db=QSqlDatabase::addDatabase("QODBC"); db.setDatabaseName(connStr); return db.open(); //qDebug()<<"UserSoils::connectDb(),"<<db.lastError().databaseText(); 8/31/2005 tt给出的重载最小化的方案并不是很好的方法,在WindowStateChange后,实际上minimizing已经完成, |
|
|