Category Archives: Qt

配置 qt creator 3.2.2 debugger for mingw

新版本的qt creator 3.2.2 要求 GDB 7.6以上,且支持python。所以老版本的,也包括从mingw官网里下载过来如GDB 7.6的都不能用。

新版的Qt往往自带qt creator,直接安排就好,但老版本的,比如qt 4.8版本就需要自己配置。很费一翻劲。

qt 4.8要求mingw GCC 4.4.0,现在qt官网上都已经不提供。我以前从nokia ftp上下载来的mingw-gcc440_1.zip,可以用。但里面自带的gdb是6.8版本,不能被新版本的qt creator所用。如果不想用qt creator 3.x,那得倒退到2.0以前的版本吧(我测试过creator 2.5.2版是不能用的)。

然后从非官方的gdb for mingw下载支持python版的gdb。地址是http://sourceforge.net/projects/gdbmingw/files/?source=navbar。我的测试是目前最新的gdb2014-05023.zip就可以用。

将下来的gdb-python解压缩覆盖到 mingw的安装目录,会提示覆盖,覆盖即是。

此外还需要安装 python 2.7,从python官网下载即是,但最好是 2.7.5版本以上,我的是2.7.8。gdb好像不支持python 3.x。

然后在creator里手工配置Tools > Options > Build & Run 里的 Qt versions, Compilers, 和Debuggers,保存后,配置Kits。即可。

一个启示是如果我们想编译qt 4.x  for mingw版本,qt creator可以不必是基于mingw,但gdb必须是基于mingw,且是被qt creator识别的支持python版本的。

QProcess在超算LSF提交到计算节点上Segmentation fault的问题

TopModel被包装在QProcess里,在登录节点运行正常,但用bsub提交到计算节点时,出现 segmentation fault错误。

调试了一上午,发点问题出在 QProcess的几个connect函数上(比如连接了QProcess的finished事件等),将这些connect注释掉,segmentation fault消失。

所以一个问题是,是不是Qt里全部的事件机制在超算lsf上都不能用么?不过我用的整个程序没有进入事件循环(只是用了QProcess类而已),是不是跟这个有关系,但在登录节点上是可以运行的。

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
gcc-4.3.0-20080502-mingw32-alpha-bin
mingw32-make-3.81-20080326-2
mingwrt-3.15.2-mingw32-dev
mingwrt-3.15.2-mingw32-dll
w32api-3.13-mingw32-dev

先用gfortran编译了三个f90文件,生成 .o文件,如

gfortran –c module_sf_noahlsm.f90

然后在qt4 pro文件里添加,

OBJECTS += ./module_model_constants.o
./module_Noahlsm_utility.o
./module_sf_noahlsm.o

在LIBS里也需要添加 –lgfortran

qt4编译连接国;过,加载数据测试无误。实现了fortran 90与qt4的一种连接。当然不是最好的方式,有见人在讨论版上说通过修改qt4 spec文件实现直接在pro里添加.f90,调用gfortran直接进行编译,然后相连。这当然是最好的,但对于一般用途,上述方式也足够。

基于Qt实现的优法算法工具包

目前工具包集成了遗传算法,二进制遗传算法,模拟退火,快速模拟退火(VFSA),SCPSO(见王书功博士论文),和线性规划。模型部分目前只集成了简单的二水源新安江模型。目标函数包括了NSE、RMSE、BLAS等;优化目标包括最大化和最小化。

工具包使用Qt 4实现,理论上可以在Windows、Linux、Mac等主流平台上编译运行,但我们只测试了Windows平台。

存在的问题:

1. 目前没实现多线程和并行支持(尽管一些算法本身是支持并行),如果计算量过大,会导致界面不响应。

2. 以后如果增加 目标函数收敛 的动态图形界面,就更完美了。

image

Qt 4.5将以LGPL发布

转帖一个有关Qt的信,绝对天大的好消息,Qt 4.5版本会以LGPL发布。这样大家可以放心用于商业用途,而无需关心版权的问题了。Nokia还是财大气粗呀。

Dear Qt User:
Nokia is pleased to announce that with the release of Qt 4.5 you will
be able to use Qt under the Lesser General Public License (LGPL)
version 2.1 terms. When released in March 2009, Qt will be made
available under three licensing options: Commercial, LGPL and GPL.
Prior versions of Qt are not impacted by this announcement.
Nokia is committed to Qt and its continued development. By offering Qt
under LGPL version 2.1 license terms alongside today’s licensing
options Nokia hopes to:
– facilitate wider adoption of Qt across industries, desktop, web and
embedded platforms.
– establish Qt as a de facto standard for application development.
– receive more valuable feedback and increased user contributions to
ensure that Qt remains the best-in-class, cross-platform framework.
– extend Nokia’s existing platform commitment to the open source
community.
By offering a cost-free LGPL license as well as commercial and GPL
licenses to Qt, you can choose the license model that best fits your
development requirements.
Irrespective of which license model you choose:
– Qt Software is committed to continuing to provide our customers with
the same level of professional support, services and regular releases
you have come to expect of Qt Software.
– We will continue to actively develop Qt, and with a greater degree
of cooperation with the community through a new contribution model, we
hope to make Qt even more valuable to our users.
For more information on the introduction of the LGPL license and what
this means for you, please consult the Frequently Asked Questions
section on www.qtsoftware.com.
Best regards
Tom Miller
Director of Sales
Nokia, Qt Software

QGIS

QGIS 1.0出来了,想拿 visual studio 2008 c++ express 编译一下,结果发现依赖的库太多了,还不是一下子能搞定的事。想将这个用起来,刚提交的863任务书将原 arcengine改成 qgis,将swat模型改成 noah,还是尽量的使用开源吧。研究性的东西不应该全用闭源或者商业的东西,不利于成果的推广。

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);
aLabel.setText(“this is really important”);
aLabel.show(); //当离开这些代码在的函数时,这个Label对像就消失了

QLabel* aLabel =new QLabel(this);
aLabel->setText(“this is really important”);
aLabel->show(); //这个标签对像只有当父对像(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类。

当然,如果你需要的控件是独一无比,除了自已写就别无选择了。不过需要注意写控件是不容易的,需要小心的设计和大量的努力。

(待续)

Qt 4.4 + msvc2005 下安装Eric 4, a python IDE

下载了Qt 4.4.0开源,指定msvc2005 spec,编译了大概2小时完成。
*一定要shared DLL
*一定要开源版,如果是商业的Qt 4与开源的PyQt等协议有冲突

下载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:python25python 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.0bin前还有个路径C:Program FilesMATLABR2007bbin有老版本的QtCore4.dll。将c:qt-4.4.0bin移到MATLAB前解决此问题。

安装QScintilla2 for Python binding(在源文件Python下),见dochtml-Qt4index.html。此步骤须在安装PyQt后,否则提示找不到PyQt v4。

将qscintilla2.dll从%QTDIR%lib拷贝到%QTDIR%bin目录下。

下载eric4-4.1.5,c:python25python install.py,安装之。

涉及到较多的开源包,一般安装步骤都是:

c:python25python configure.py
nmake
nmake install

注:

QScintilla-gpl-2.2的python binding生成的Makefile好像有问题,产生link error,可能原因是没有定义-DQSCINTILLA_DLL。可以打开configure后产生的Makefile,在CPPFLAGS里增加此定义。

可以下载QScintilla-gpl-2.2.1-snapshot-20080610,此问题已经更正。

好一阵折腾呀!

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.