Monday, August 27, 2007

by Harald Fernengel translated by jams.lee
Qt使用MOC(元对象编译器)来收集自定义类的信息.这些被应用于信号/槽机制,并且使Qt应用程序可以是自省(introspection)的。在Qt4 中,三个新特性—-动态槽调用,排队信号(queued signals),对用户自定义类型的支持—-需要我们扩展Qt的元类型信息。



Qt引入了QMetaType类来支持在运行时注册一个新的数据类型。任何一个具有公有构造函数、公有拷贝构造函数和一个公有析构函数的类或结构都可以被注册。例如:




qRegisterMetaType<employee>("Employee")


类Employee就会被注册。这样QMetaType就会知道如何构造、拷贝和析构这个类的实例。每一个注册了的数据类型都拥有一个唯一的ID号,这个ID号可以通过 QMetaType::type() 获得:




int employeeId = QMetaType::type("Employee");


我们就可以使用这个ID动态的构造、拷贝、析构Employee




void *original = QMetaType::construct(employeeId, 0);
void *copy = QMetaType::construct(employeeId, original);
QMetaType::destroy(employeeId, original);
QMetaType::destroy(employeeId, copy);


在大多数Qt应用程序中,我们只需要关注 qRegisterMetaType() 就可以了。Qt会根据需要相应地调用 construct()destroy() 。在以后各节中,我们介绍Qt4构建于QMetaType基础之上的各种特性。



动态槽调用



QMetaObject可以使QObject子类的信号和槽是自省的。这通常被应用于测试框架、脚本绑定,以及一些accessibility utilities。
在Qt的早期版本中,动态调用一个槽的唯一方法是将一个信号和这个槽连接,并引发这个信号。在Qt4中,槽可以通过 QMetaObject::invokeMember() 来调用:




QMetaObject::invokeMember(object, "clear");


如果这个槽需要参数,可以使用QArgument来传递,或者使用更方便的Q_ARG()宏:




QMetaObject::invokeMember(statusBar, "showMessage",
Q_ARG(QString, tr("Ready")),
Q_ARG(int, 2000));


QMetaType在幕后负责数据类型的列集(marshalling),任何已经注册的数据类型都可以通过QArgument或者Q_ARG()宏来传递。像int这样的原生类型和QString这样的Qt类都已经被预注册过了,所以我们可以不受限制的传递这些类型。



排队信号
在Qt3中,信号是同步传送的。Qt4引入了排队信号的概念,它可以使槽被异步调用。与发送事件类似,信号在应用下一次进入消息循环时被传递。事实上,排队信号被实现为事件(event)。

Monday, July 23, 2007

学习是为了什么?搞研究是为了什么?
很多人的看法,都是作学问的目的是为了以后不作学问,作学问只不过是其仕途道路的一段而已。这样的学术态度怎能出成果?怎能让人佩服?
我只想踏踏实实的做一些研究工作,可别人却把我评价为只不过是一个干活的人而已,说不好听了,那就是别人手里的一个工具,领导的一个民工。
我从小的理想就是想做一个科学家,但是这个想法在别人眼中却成为了一个笑话。我自认虽然没有科学家所应该有的智商,但我却有一个科学家所应该有的精神,所应该有的学术道德。那种东拼西凑一些文章,靠着文章数量去评职称、走仕途的事情,我是做不来的。单从这种道德上来说,我也是一个合格的学者。我们这种人,决不是那些世俗的人所说的那种只会干活的知识民工,决不是!

Sunday, July 15, 2007

大家知道,VC6.0中for循环里面的变量作用域扩展到了for循环之外,比如



for(int i=0;i<5;i++)
{
//...
}
for(int i=0;i<10;i++)//error
{
}

这一行为不符合C++规范,导致很多在VC6下开发的程序不能在更高版本的VC下编译。近日翻看Trolltech Qt4的代码,发现要将VC6中循环变量的作用域限制在for循环内部其实很简单,只要在项目中一个所有cpp文件都包含的.h文件中加入如下代码



#define for if(0){}else for

Thursday, May 24, 2007

自从我这个博客建立起来以后,我就一直想试着写一点东西。可是每每当我坐在电脑前,打开我的博客,我却发现我无话可说。我非常可悲的发现,我竟然变成了只会和机器打交道,几乎丧失了表达自己观点的能力的人。
这十几年来,我一直浸淫在研究那些枯燥的计算机技术中,几乎每天都想着那些字母和二进制的数字,连思维模式似乎已经变成了计算机的工作方式,大脑变成了冯德伊曼计算机。除了编写计算机程序,其他的事情我都做得不大好,这并不是我做不好,而是我不大愿意想技术以外的事情。
念硕士的时候,很多同学都可以做一点东西,就总结一下,然后写一篇文章发表,甚至有的能被EI检索。而我虽然做了很多的项目,其中有的项目不乏处于国内领先的创新点,每当提起笔来我却大脑空空,笔下无字可写。
其实我也很清楚,在现实的工作中,善于总结工作,形成报告,要比完成工作重要得多。仅仅把工作做完,做好,并不能让别人看到你的价值,因为别人并不知道你工作的难度和遇到的困难,这需要将工作的成果转换成文字,让大家了解。这样才能在工作中表现自己。

Lenovo Support & downloads - Hardware removal and installation - ThinkPad T60, T60p

Thinkpad T60硬件移除和安装的视频
Lenovo Support & downloads - Hardware removal and installation - ThinkPad T60, T60p

如果因为安装其他操作系统或者使用了一些分区工具导致Thinkpad上的一键恢复不好用了,可以尝试使用这个命令来恢复
bmgr32.exe /fbootmgr.bin /M0 /Think

Sunday, February 11, 2007

一篇不错的文章
UNIX 高手的 10 个习惯