Author Archives: nanzt

Qt编程最佳实践21项(一)

C. Probst, Oct 2008

来自ICSNetwork视频,Zhuotong Nan([email protected]) 整理。原视频地址: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类。

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

(待续)

tray里的network icon提示不通,事实上无线是通的

新买的thinkpad x200是安装的vista,感觉程序运行的还流畅(更多是因为机器性能提高了,自然会流畅一些,但vista那个系统是真叫大,占了我10G的空间,再加个系统还原占的15%,合计40多G就没了),但各种问题也不少。前面已经bluescreen了一次,这两天又注意到网络图标的问题。尽管不影响使用,但就是不知道是怎么回事,也许是vista的bug?

thinkpad x200自带的access connections来管理无线。使用住所的无线,那个网络图标上面有个小蓝球,鼠标移到上面,提示说“未连接,您目前没有连接到任何网络”,但事实上是通的。到学校的办公室,那图标干脆就是红叉,同样的提示说不通,事实上是通的。

google了一些帖子,大家也没有啥发的解决方法。大家都推测是不是vista的一个bug。

每次重启机器,Window Live Messenger总是提示安装

每次重启我的Vista 机器,总会出来一个安装的窗口,自动安装Window Live Messenger。即便卸载了WLM,重装,问题仍然存在。

具体原因不明,在网上看到一个帖子,说是可能因为MS installer此前的安装出问题导致,该帖子介绍了一个叫 ms installer clean up utility。可以从微软的网站上下到,地址是:

http://support.microsoft.com/kb/290301

安装后,运行,将Live messenger给清理掉。然后跑到安装/卸载程序里,将Live登录助理、Live installer也给卸掉。再重装安装WLM,发现前面的问题已经不再出现。

移去“我的共享文件夹”

安装成Windows Live Messenger,Vista系统的“计算机”下多了一个“我的共享文件夹”,这主要是用于Messenger共享,其实没多大用。所以想将之移去。直接删是删不了的。

可以通过编辑注册表来达到目的。

在运行里键入regedit,打开注册表编辑器,到

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionexplorerMyComputerNameSpace{FC9FB64A-1EB2-4CCF-AF5E-1A497A9B5C2D}

这个注册表项下可以看到这是Messenger Sharing Folders。

将{xxx}整个项移去。为安全起见,你可以先备份这个项,方法是右键,导出。

移去后,再回到浏览器看,已经没有这个文件夹了。

遭遇vista蓝屏

不知道执行了什么操作,vista蓝屏,重启后,recover了不知时间,终于进入了,发现几个service不能用,包括 dhcp, network list, network location awareness, firewall, diagnostic policy等都不能用。手工启动提示说 access denied,估计是local service帐户的权限出问题了。

在网上找了好久,在ms knowledge base里找到一个相关的,需要配置一些register key的权限,照着配置,发现还是不能用。网上很多人也是类似的情况,没有好的解决方案。

于是想到是否可以用system restoration。xp下的这个东西比较好用。在vista下发现执行出现 unspecified error,导致系统还原无法进行。后来跑到 safe mode(启动时按f8)下执行,才搞定。进入一个几天前的还原点,还原之。

再进入vista发现这回可以用了。好在这些天系统程序没啥安装,所以还原回来基本是一样的,最近只是安装了几个update。

终于又可以上网了。

vista总的感觉用户友好性还比不上xp,一些功能都被藏起来了,要用的时候找出来都要费好大的劲。常用的功能倒是组织的不错。象一位同事感叹的,不知道下版本的windows会怎么样。

word 2007 窗体域的保护

在填DS158e 表的时候,下载ds158e是窗体保护的,只有一些窗体域是允许填的,但ds158设计的不是很好,填上文字后,2页变成4页了。不美观。

image

有一个法子,就是将窗体保护去掉,然后再删除一些空白行,使得4页再重新变成2页。

btw,窗体域及保护是很有用的方法了。word 2007里藏的比较深。在“审阅”的“保护”项里。点击“保护文档”后,弹出菜单里,点击“限制格式和编辑”。由于DS158e没有设置保护密码,所以点击 右侧的任务面板“停止保护”。这样就可以修改了。

image

修改合适了,再点击任务面板上的“强制保护”,密码留空。

基于知识推理的节水城市评估系统

学生应用clips做了一个简单的节水城市评估原型系统,初步演示了,

1. 知识推理引擎可以应用在水资源有关的管理和实践上。知识推理引擎尤其在涉及大量复杂知识规则的系统里,将十分有效;

2. clips与gis的集成,clips与其它应用程序的集成。

snap020snap021 

snap022

开发环境,

clips 6, Qt/win opensource, vc++ 2008 express, arcgis 9.2