iCAx开思工具箱

标题: 今天,我QT了! [打印本页]

作者: 深夜摔键盘    时间: 2005-8-15 09:55
标题: 今天,我QT了!
太累了,自己给自己放了一天假。结果也没闲着,搞了一天QT
  
QT是什么?先问问自己:MFC是啥?
QT和MFC都是GUI(图形用户界面)类库,windows程序设计中,常叫Application Framework的。不过MFC只能运行于WINDOWS上,QT除了可以运行在Linux/unix系统上,在windows平台也能运行。同样是程序图形界面库,但在咱们中国,厚MFC而薄QT。
  
QT诞生于1994年,是挪威的一个叫做Trolltech 的公司开发的,它可以运行在Windows (所有版本), Mac OS X, 所有的 Unix 和 嵌入设备上。从1996年早些时候,Qt进入商业领域,现在它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础。
  
QT到底哪儿好?
因为本文仅讨论windows下的QT。其他操作系统,俺一个也没用过,就没有发言权了。
QT最诱人的特点是:"write once, compile anywhere",就是说程序只需要有一份代码,如果你想在WINDOWS平台运行QT程序,那么虽然你的代码是在LINUX平台写的,但无需改动,只需要在WINDOWS平台重新编译一遍,程序就可以运行无阻了。这就是“只写一份代码,到处都可以编译”的统一API编程方式!程序员不再为写跨平台软件而犯愁了,麻烦都被QT给解决了!
有许多优秀软件的界面都是使用QT做的,它们即可以在UNIX下运行,也可以在WINDOWS下运行,write once, compile anywhere嘛!我截两张图,大家可以看看!
作者: 深夜摔键盘    时间: 2005-8-15 09:58
图2
作者: 深夜摔键盘    时间: 2005-8-15 09:59
上面两张截图是两种很优秀的3维曲面软件的界面,前者叫ICEM SURF,德国人做的,很朴素,又实用。后者叫IMAGEWARE,美国人做的,比较花哨,但的确很好看。下面,我再贴一张国产的曲面软件Re-Soft的界面截图,是浙大搞的,比较典型的MFC界面。与前两个曲面软件中的老大相比,Re-Soft在许多功能上并不落后,但它只能运行在win2000/xp上,而且门脸显得很没特色,很难想象它是一个做了将近20年的软件!而前两个软件纵横于unix和windows之间,界面风格让人耳目一新,在中国,它们都卖的贼贵,比Re-soft贵10倍!大家说值不值呢?我们在技术上不怎么落后,究竟因为啥卖得那么贱?
  
RE-SOFT界面截图:
作者: 深夜摔键盘    时间: 2005-8-15 10:02
我想不管QT是不是真的有传说中的那么好,我觉得我们都应该尝试一下!另外现在的MFC,已经是比较落后的技术,对于微软,它有沦变为鸡肋的趋势。除非微软从整体上对它进行改写,添加更多的现代OOP程序设计理念,让它变的更像C++,而不是更MFC!
作者: 深夜摔键盘    时间: 2005-8-15 10:02
得到QT,并安装之
  
以前的QT,对WINDOWS只提供专业版和企业版,它们都是商业版本。但现在最新版的QT4,对WINDOWS也GPL了,提供了开放源码版。但因为目前QT4的白皮书尚未发布,没有多少编程资料可供参考,故本文只讨论QT3,熟悉了QT3,再去学习QT4,就该事半而功倍了。但你现在可以立即得到QT4的WINDOWS开放源码版,可到www.trolltech.com/download/qt/windows.html下载win-opensource-desktop-4.0.0.mingw.exe。
(注:如果你还不明白什么是GPL,那么就到这里看看:https://zh.wikipedia.org/wiki/GNU_GPL)
  
前面说过,QT4之前的版本只提供给WINDOWS专业版和企业版,得向Trolltech购买。如果你只买WINDOWS 桌面版本的QT报价:https://www.trolltech.com/products/qt/pricing.html 。虽然人民币升值了,我们大多数人也是买不起的!那我们去哪里寻找不花钱的WINDOWS版本的QT3呢?说到这个问题,我很佩服国外的程序员急公好义。一个致力于将KDE移植到WINDOWS平台的KDE-CYGWIN小组做了一件很了不起的事情,他们将X11系统的GPL版的QT移植到WINDOWS上了,这是他们移植KDE的一个子项目,搞得很成功!因此,我们就有了可以在WINDOWS版本的自由QT3了!
Qt3/windows free版的下载地址:https://sourceforge.net/project/showfiles.php?group_id=49109
寻找适合你的编译器的版本,譬如我用的是VS.NET 2003企业结构版,那么就得下载setup-qt-win-free-msvc.net2003-3.3.4-3.exe。down下来的是一个安装文件,直接安装就行了。一开始我没有找到这个页面,结果费了半天的工夫,编译源码装上的。
作者: 深夜摔键盘    时间: 2005-8-15 10:05
让QT说:HELLO WORLD!
  
好了,假定你已经把QT3/windows装上了,现在还需要down一本名为《C++ GUI Programming with Qt 3》的书,可以GOOGLE到,也可以到下面的地址down:
https://www.linuxfans.org/nuke/modules.php?name=Site_Downloads&op=geninfo&did=2834

https://qtcn.kmip.net/bbs/read.php?tid=1082&fpage=1
  
找到了这本书,开篇第一个程序就是HELLO WORLD!下面我们在visuual studio .net 2003中搞定它。新建一个WIN32 CONSOLE项目。删除stdafx.h和stdafx.cpp,然后编译一下,可能会出错,需要修改项目的属性,去掉编译头的使用。从菜单”项目 | 属性”打开属性设置对话框,做如下设置:
作者: 深夜摔键盘    时间: 2005-8-15 10:10
然后写入如下代码:
1  #include <qapplication.h>
2  #include <qlabel.h>
3
4  int main( int argc, char **argv )
5  {
6  QApplication app (argc, argv);
7  QLabel *label = new QLabel("Hello World!", 0);
8  label->setGeometry(100,100,200,130);
9  label->setAlignment(Qt::AlignCenter);
10
11  app.setMainWidget(label);
12  label->show();
13  return app.exec();
14 }
编译。结果出错,提示qapplication.h找不到!肯定是没配置VS.NET的头文件包含环境。从菜单 “工具 | 选项”打开选项对话框,做如下设置,主要目的是让VC++.NET在编译程序时,能找到你所用的头文件!
作者: 深夜摔键盘    时间: 2005-8-15 10:14
然后再编译,结果可能要出现一大堆连接错误!这是因为编译器在进行程序连接时找不到所需要的QT库,还需要设置一下lib库的目录,再打开“选项”对话框,做如下设置:
作者: 深夜摔键盘    时间: 2005-8-15 10:17
然后还需要进行最后一道设置,要告诉编译器连接QT的哪几个库,这个要在“项目 | 属性”中进行设置,添加qt-mt3.lib和qtmain.lib文件。
  
再编译连接,成功了!!!
但是你在运行这个程序时,也许会出问题,提示你qt-mt3.dll没有安装!这是因为程序在执行时,WINDOWS找不到你的程序所需要的库qt-mt3.dll,因为WINDOWS寻找DLL文件的路径就是固定的那几个,这时,你得把$(QTDIR)\lib中的qt-mt3.dll拷到你的WINDOWS目录下的system文件夹中!
  
再运行程序,终于出来了!
作者: 深夜摔键盘    时间: 2005-8-15 10:18
我高兴了一下,发现咋还带着一个控制台窗口捏?现在得回头来看一看刚才写的代码了。
代码的第6行,创建一个QApplication对象来管理整个程序的资源。在构造QApplication对象时,需要argc和argv,因为QT支持命令行参数。
  
代码的第7行,创建了一个显示”Hello Qt!”的QLabel widget。在QT的术语中,widget是一个可视元素。按钮,菜单,滚动条和框架都是widget。一个widget能包含其他的widget。例如一个程序窗口通常要包含了菜单、工具条、状态条、还有其他的widget对象。QLabel对象,也就是标签对象,在WINDOWS中称这种东西为静态文本,它的构造函数中,参数值0表示其父窗口指针为空,就是说这个QLabel本身就是一个窗口,而不是附属于其他窗口。这种程序理念在WINDOWS中是没有的。
  
代码的第8行是设置这个QLabel的大小,前两个参数表示其左上角坐标,后两个参数表示其宽高。
  
代码的第9行表示让QLabel上的文本居中显示。
  
代码的第11行,让QLabel作为程序的主窗口(main widget),当用户关闭主窗口时,程序就终止。如果没有main widget,那么窗口关闭后,程序在后台依然是运行的!不信,你可以把这行去调,看看程序执行结果。
  
代码的第12行,QLabel显示出来。
代码的第13行,程序的控制权就开始移交给Qt了,开始进入QT的消息循环。只有当QT的main widget被关闭后,程序控制权才再交给main函数,然后main函数再返回。这个你可以测试一下,你把那个HELLO QT窗口关闭之后,控制台窗口就会出现:Press any key to continue。
  
我不想让我的程序屁股后面还得出现一个控制台窗口,要把它去掉,只需要在程序的开始添加一行代码:
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )  
至于为什么添加了这行代码就能隐去控制台窗口,可以参考下面这篇文章:
https://www.ccw.com.cn/htm/app/aprog/01_9_28_2.asp
  
最后,对程序代码稍加改动,代码的第7行,修改为:
QLabel *label = new QLabel("<h1><i>Hello</i> " "<font color=blue>World!</font></h1>", 0);
  
再编译运行程序,就成了下面这个样子了,其中的奥妙之处,自己琢磨去吧。
  
这就是我QT的一天。
作者: shuixing    时间: 2005-8-15 10:24
祝你越来越厉害
作者: 深夜摔键盘    时间: 2005-8-15 10:26
下一个问题就是,该如何将QT运用到UG的二次开发中。
作者: 西方老败    时间: 2005-8-15 10:33
RE-SOFT比的了ICEM,IMW吗。
作者: 深夜摔键盘    时间: 2005-8-15 10:37
嘿嘿,我不是说了嘛,在某些功能上,RE-SOFT是不比ICEM 和IMW差的。
在算法上,RE-SOFT已经足够先进了。
只是他们的软件做的不够好!
作者: 西方老败    时间: 2005-8-15 10:44
那里有下载的吗
作者: 深夜摔键盘    时间: 2005-8-15 10:44
楼上是说RE-SOFT吗?你去www.zjcad.com技术论坛的反求工程版去看看置顶的帖子,可以下载,不知是不是试用版。
  
我再贴一些QT演示程序的截图:
  
图1。QT的各种widget,前面文中说过,widget是可视元素,窗口由widget组合而成
作者: 深夜摔键盘    时间: 2005-8-15 10:50
支持OPENGL,QT中对OPENGL做了比较好的封装
作者: 深夜摔键盘    时间: 2005-8-15 11:01
朴素风格的widget
作者: 深夜摔键盘    时间: 2005-8-15 11:09
可以拖放的透明位图窗口,这个窗口是用了70行代码写出来的!我记得当年学习MFC时,也想做一个这样的窗口玩,被资料上一大堆代码吓跑了。
作者: pzytony    时间: 2005-8-17 21:29
厉害!
作者: 我想摔机箱    时间: 2005-8-18 08:58
能交个朋友吗??公司要做qt软件开发!我第一次接触这个东东请大侠多多指教!!!
作者: 我想摔机箱    时间: 2005-8-18 09:02
我也想学qt!能交个朋友吗??qq510514351
作者: 深夜摔键盘    时间: 2005-8-18 10:34
呵呵,好啊,已经加了。
  
我也是第一次接触。共同努力!!!
  
希望还有个摔显示器,鼠标的兄弟也一起来!!!
作者: zzz    时间: 2005-8-18 17:42
只是做界面的?还是一个开发环境?
作者: 深夜摔键盘    时间: 2005-8-18 20:12
它没有自己编译连接工具。但是在主流的编译器上,都能使用它,就是一套工具库。但它是有一个开发环境的,KDE/Develop。现在KDE也有了WINDOWS版本了。
  
也不尽是做界面,以C++对象之间的通信问题为例。今天试了一下,用QT提供的信号/槽机制很容易就能够实现,避免了使用回调函数带来的不安全因素。而且概念清晰简单多了,很有对象化的感觉。只要是一个QObject的派生对象,就拥有与其他对象的通信能力。
  
譬如对象A在执行一项操作,它需要通知对象B,让B有所响应。这时,只需要在类A中定义一个“信号”(signal),在类B中定义一个“槽”(slot),也就是响应信号的成员函数,然后对信号和槽简单地进行连接。当对象A执行某项操作时,只需要"发射信号“(emit a signal),那么对象B中的”槽“就开始工作了。
  
简单的说,就是对象A发射一个信号,对象B接到信号开始工作。同样的事情,在MFC或其他C/C++库也可以实现,但它们大都是利用C/C++回调函数来实现的。而且,MFC的对象通信只限于WINDOWS窗口对象,很难用到普通的C++对象之间的通信上。
  
这种机制很不错,QT的文献中称信号/槽技术不是使用C/C++的回调机制实现的,更安全,稳定!据说是有人测试过,一个”信号/槽“的实现,其运行速度,在586的机器上,与一个功能等价的回调实现相比,只慢10微秒。
  
改天给一份实例。
作者: liuruixiao205    时间: 2005-8-19 09:42
厉害
作者: 我想摔机箱    时间: 2005-8-19 18:11
版主我今天刚装了linux其中好像有自带的qt 软件!很好用!
作者: fourwood    时间: 2005-8-20 11:09
在UG二次开发中使用跨平台的GUI库有意义吗?
我知道的GUI库有QT/FLTK/FOX/WXWINDOWS/MFC/VCL/VCF/GTKMM,但在UG的二次开发用MFC就足够了吧。
通用的C++库:STL,BOOST
数值计算:Blitz++,MTL
数据库:QTL,OTL
网络通信:ACE
……
作者: 深夜摔键盘    时间: 2005-8-20 12:01
做界面,MFC的确够用。但是它的确很难用。如果做UG的二次开发,要推荐,也是得C#,但C#库的效率没有C++库高。
  
早几年,如果为了做UG的二次开发,去学习MFC,那无可厚非的。但现在再去花上个大半年的光景狠啃《深入浅出MFC》,就有点不合时宜了。可以说MFC是好技术,只是已经落后了。
  
另外,可以考虑在UG二次开发中利用QT的信号/槽机制,来实现C++对象的通信。昨天晚上做了个试验,可以在MFC程序中,使用信号/槽的。但为了安全,我没有采用,使用了另外一个轻量级的库。如果有时间,我想测试一下纯的QT版本的UG二次开发程序,如果可行,那么在UG的二次开发中用QT来取代MFC,也不是不可以。
  
一个公司做的二次开发技术成熟以后,也许它还想把产品卖给UNIX用户呢。那样还怎么用MFC。
作者: 我想摔机箱    时间: 2005-8-23 08:19
不知道哪位大侠能告诉我linux9.0中自带的qt desiger 和qt embedded 有什么区别??好像他们的界面是相同的!而且在安装linux9.0之后再按装qt embedded有没有相互之间的冲突?? 再此先行谢过!
作者: 深夜摔键盘    时间: 2005-8-23 08:21
qt embedded 是用于嵌入设备的QT。
  
qt desiger是用来设计界面的。
作者: 我想摔机箱    时间: 2005-8-23 12:48
谢谢!那我在linux下安装的QTE怎么只有一个框架?主界面应该有很多图标才对啊!!
作者: 我想摔机箱    时间: 2005-8-23 12:54
安装完应该是下面这样的!不知道是哪里出问题了!
作者: 深夜摔键盘    时间: 2005-8-23 15:20
也许与你用的是虚拟平台有关系吧。
作者: liuhongying76    时间: 2005-9-16 09:41
标题: 探讨一下!
我按照你所说的照做了,编译简单的程序比如HELLO WORLD没问题,但只要编译复杂一些的程序,比如turorial下的t14就会出错,具体现象是编译可以通过,但无法成功链接,提示一大堆信息,意思说无法找到外部引用,我把QT安装目录LIB目录中的所有LIB文档加入还是不行,请指点一二.
作者: jeffzhangqiong    时间: 2005-9-18 23:03
标题: ??
说实话,不是很懂,不过有点概念,我还是很感兴趣,能不能请大侠指点一下,教材啊网站啊啥的,,我可以自己再自修一下
作者: 深夜摔键盘    时间: 2005-9-19 17:45
几天没上来了,啥都变了个样子。呵呵

楼上兄弟的问题,我不很清楚。我当时,只不过有些无聊,学了那么一点点。关于QT的站点,我前面的贴子里有提过。

库没有连接上,问题定出在你的编译环境的设置上。要么把你的配置抓图搞上来,看看吧。
作者: cxs98    时间: 2005-10-11 23:27
看看
作者: popo_2001_12    时间: 2005-10-13 08:54
标题: 同意
同意
作者: 深夜摔键盘    时间: 2006-1-3 20:11
刚发现这个贴子被加了精,不应该的。毕竟和二次开发关系不是很大。

后来,我做了尝试,QT的确能够应用到UG的二次开发中,但所实现的QT窗口是独立于UG窗口的,这个问题很难解决。主要是因为WINDOWS平台的UG主窗口是用MFC做的,WINDOWS系统中,窗口是以句柄来控制的,但QT中没有句柄的概念,结果是QT窗口无法作为UG的子窗口运行。

但当时的无心之举动,对QT产生了一些兴趣。现在课题做完了,正在向LINUX转型。还在痛苦期间,但也是值得的,觉得LINUX是编程爱好者的天堂。
作者: fourwood    时间: 2006-1-8 16:11
原帖由  于 2006-1-3 20:11 发表
刚发现这个贴子被加了精,不应该的。毕竟和二次开发关系不是很大。

后来,我做了尝试,QT的确能够应用到UG的二次开发中,但所实现的QT窗口是独立于UG窗口的,这个问题很难解决。主要是因为WINDOWS平台的UG主窗 ...

不能说关系不大,QT是个好用的C++类库,特别是GUI不错,WINDOWS下UG窗口可以作为QT窗口的父窗口,正如同WINDOWS的窗口可以作为QT的子窗口一样,当然QT的可移植性就没有了。
作者: zhangcanwei    时间: 2006-1-9 18:25
嗯。
搬个凳子听听课。
作者: Juven201314    时间: 2007-11-19 22:44
有些图片看不到
作者: 张少杰    时间: 2010-11-21 15:49
谢谢楼主分享啊




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3