Monthly Archives: August 2005

得到russian一个朋友给的qt 4.01 patch

1. 下载qt-win-eval-4.0.1,自己到trolltech下载
2. 下载patch
3. 安装qt eval
4. 将patch的内容解压缩到bin目录下
5. ok

声明,本人使用opensource版,且准备要购买Qt 4.x,本信息只是在网上看着了,转帖一下,而patch是russia的朋友在rapidshare发现的,然后转告于我。如有不妥,请告知,即刻删除。

[转帖]小龙女的真面目和杨过跳崖真,相

搞笑,好玩,大家轻松一下
见鬼,标题上的“真相”两字属于禁止语言,无奈只有隔开了


第一幕:逼上悬崖

  我站在悬崖上,背着玄铁剑,出离愤怒。

  这事儿你们也都知道了——我姑姑她今天早上又从这里
跳下去了。原因是我嘟囔了一句这房子就是室内污染得太厉害了,要不她怎么怀一个小小龙女,就流一次产呢?叫她去买最新的去污产品“天下无贼健康钛”,她又
说我是嫌弃他老了,不好看了,接着流产的名义要换老婆,说这叫这叫喜新厌旧。我跟她讲你没有文化不会用成语就不要乱用,她开始撒泼。撒泼无效,就冲出门去
直奔悬崖了。可见真理说不得,她流产的原因医生都说了,就是因为室内污染,甲醛超标,这是事实,人所共知。

幕后:小龙女的真面目

  她现在除了还老事儿事儿地整一身白衣服穿,其他的已经没有什么地方像当初那个冰清玉洁的小龙女了。

 
 她有以下几个重大变化:第一,发胖。婚后她变成一个喜欢吃肥肉的女人,隔三差五要求我到林子里去给她打肥猪。在婚前我们俩练剑的时候因为是混合双打经常
要有一起飞翔的高难动作,那时候这个动作做起来比较轻松而且给我一种极大的满足感。现在我再要和她那一百六十多斤的身躯再来一趟《玉女素心剑法》,下来之
后就和洗个桑拿没什么区别。

  第二,唠叨。她唠叨起来无人能比。我在想当初我认识的那么多美女为什么都被我轻而易举地放走了。是啊,那时候她的涉世未深很招人喜欢,可是你应该知道涉世未深的人也会有饱经世事的时候。教训呐

 
 第三,浅薄。女人浅薄并不奇怪,但是能浅薄到小龙女那个份上的,毕竟少。自打她开始接触社会以后,社会上那些光怪陆离肤浅粗俗的东西对她构成的诱惑总让
我提心吊胆。她对此不以为耻,反以为荣——不不不,你别给我宽心说这个叫可爱,要是你老婆奔五十岁的人了还戴小黑框眼睛染绿头发穿露脐装,你害臊不害臊?

回忆:跳崖之路

  两个人的世界真是让我们两个过恶心了。所以她就开始变成一个地道的搅屎棍子。我不搭理她,她就跳崖。

 
 根据我的不完全统计,今天这是她的第五次跳崖。比较无聊的是:我是大侠杨过,所以我不能不下去救她。最初我们的爱情是江湖中一个著名的传奇,那时候我挺
得意,逮谁跟谁讲我最早那次跳崖的英雄经历。没有想到,现在我们俩家常便饭下饺子一样的跳崖已经成了江湖中一个著名的笑话——对这个,我没有办法。

第二幕:跳下去了

  住我们家隔壁的郭襄含着泪花儿跑过来,对我说,“杨大哥,你要保重啊。“多好的闺女啊。我有点感动,就把头扭向另一边,怕让她看到我的神色。稍远一点围观的群众都有点激动:“今天正好,又赶上杨过跳崖了。”“杨过,加油。”“多酷啊,好棒好棒。”

  断肠崖上数百朵憔悴了的龙女花飞舞乱转。我向下看,看不到我的脚面。我也老了,发福了,有肚子了。

  围观的人越来越多。

 
 我望着断肠崖前那个深谷,只见谷口烟雾缭绕。我有点头晕。岁月如飞刀,刀刀让我老啊。我在心里最后默颂一遍:下二十米,左三米,有歪脖松;然后向下十
米,向右五米,有柏树一株;然后向下五米,有石洞一个;然后向下十二米,有石块可以落足……这条路我太熟悉了。我发誓,我今天把小龙女提溜回来以后,一定
好好教育她一顿,绝不能再有同样事件发生啦。丢不起这人呐!

我最后温习了一遍之后,双足一蹬,身子飞起,跃入深谷之中。

第三幕:结局

  我下坠,下坠,下坠。脸色逐渐变了——那些松树柏树呢?

我绝望地大喊,“咱们国家不是有环境保护法吗?”我的声音在山谷里回荡,这是我这辈子最后一句话。

msn上遇到老同学

很意外,从外就餐回来翻开笔记本的时候,看到有人加我到msn,一看名字,同学呀。
很兴奋。真是很久没见了。因为远程登陆到国内server装subVersion一直没配置成功,
等真正碰到同学上线,已经是1点多了。相互问了一些情况,大家都过的不错,很为同
学高兴。她女儿10个月了,能走路了,听话语就知道,她很爱她女儿。见过帖在同学录
上的她女儿照片,很可爱。期盼快快乐乐健健康康地长大。
实在熬不住眼皮打架了,已经将近2点了,明天还要早起。只要说bye bye,很遗憾。不
过既然有msn,能聊的机会还多着呢,而且加了她的BLOG,能够相互了解一些同学们的
情况,真是一种幸福。高中的回忆很美好,此为记!眼皮打架了,睡觉中。

Today’s dinner

晚上George,Rick他们项目组的聚餐,我跟着一块去了。跑到一家中国餐馆(CHINA
BISTRO)去了,尽管叫bistro,规模还不小。里面多数是西方人,没见着几个亚洲面
孔。以前去中国餐馆,一般是buffet性质的。这次是所谓的family style。三张桌子并
在一起,长条这样的,大家找最近的人聊天。每人点一个菜,菜上来后,大家轮着往自
己的盘里搁一点,然后将菜传给旁边的人。很有意思。他们不喜欢国内那样大家都往同
个盘里伸筷子。我习惯拿着knife, fork吃,被george笑了一通,说dr nan成西方人
了,一看他们,都熟练不熟练地拿筷子在吃。气氛很好,聊的很愉快。坐旁边的lauren
的话真是多,看来哪国的女的总是比男的话多。从坐下来到最后,她的话就没停下来
过。
结束的时候,每人自觉的掏自己的一份钱。但我们的George项目上能cover掉了。前两
天(周末)去national park的时候还刚白吃了他一顿。呵呵。不过感觉他们这种习惯真是很好。公私很分明。不象国内
总是项目掏钱,自己给自己报销。
George送了一个T-shirt和hat,上面有USGS的logo,还有VOLUNTEER字样,很喜欢!
项目进展不是很大,有点心急!

Qt 4.0.1 signal的模板参数问题

描述如下:singal带2个参数,第一个是模板类型的参数,第二个是一个类,在4.01下
面编译通不过,即便第二个参数是int这样的简单类型,也不行。但如果只有一个参数
(即模板参数),可以正常通过。Qt 4.0.0没有这个问题。
解决方案:通过typedef将模板参数定义成一个别名。编译通过。

Qt里的属性(property)

Qt里的属性(property)
giscn[at]msn[dot]com


1.属性有什么用?
由于c++类具备封装特性,不推荐对类成员变量(class
variables)进行直接存取。现代编译器引用属性(property)的概念,对成员变量进行安全的存取。比如在win平台下
vc7有类似于__property或[property]的支持。Qt由于要实现其跨平台(cross
platform),引入一套独特的属性系统。其底层是由meta compiling进行支持。

2.格式
    Q_PROPERTY(type name
               READ getFunction
               [WRITE setFunction]
               [RESET resetFunction]
               [DESIGNABLE bool]
               [SCRIPTABLE bool]
               [STORED bool])

  • Q_PROPERTY: qt里定义的宏;
  • type name: 即类型名+属性名,属性名(name)在QObject的setProperty里被引用;
  • READ: 设置读取成员变量的函数名,一定要是const,可以返回void,Qvariant支持的对象,指针,或const的引用。READ是必须的,而write, reset等则是可选的;只有READ的属性为只读属性;
  • WRITE: 写成员变量的函数名,返回值必须是void,可以设置一个参数,这个参数可以是void,QVaraint支持的变量,指针,或const的引用。可选;具备READ和WRITe的属性是可读写属性。
  • DESIGNABLE: 指示该属性是否被图形编辑器(比如designer)使用。默认是TRUE;
  • SCRIPTABLE: 指示是否在script里使用,Trolltech公司同时有基于Qt的QSA,用于在应用程序的脚本编程;默认是TRUE;
  • STORED: 指示是否可被持久化(persistence)。只有WRITE被设定的时候,STORED才有效。默认是TRUE。

3. 使用
比有一个类,

class MyClass : public QObject
{
Q_OBJECT

public:
  MyClass (QString f) {this->f =f;}
  ~MyClass() {}

//property begin
  QString getF() const {return f;}
  void setF(QString ff) {f=ff;} 
//property end

private:
  QString f;
};

这时在public之前定义property
Q_PROPERTY (QString F READ getF WRITE setF)

照惯例,读取函数往往省略get,即定义了
QString F() const {return f;}
这时,Q_PROPERTY (QString F READ F WRITE setF)
但实际上,读取、写、和重置(reset)函数可以是任何名字,比如前面用getF。

在使用时,属性跟一般的成员函数一样被使用,比如:
MyClass classA("initial");
QString out=classA.getF();
//out = "initial"
QString t="this is a test";
classA.setF(t);
//classA里的f现在是"this is a test"

此外,可以通过QObject::setProperty()和property()来使用属性,比如
MyClass classB("classB");
//这时的f是"classB"
classB.setProperty("F", "this is a test");
//这时调用setF("this is a test"),成员变量f现在是"this is a test"

使用setProperty可能效率比直接调用setF低,但注意到setProperty是基类的成员,所以通过QObject::property/setProperty可以遍历全部派生自QOjbect的类的属性。比如:
QObject* p = &classA;
p->setProperty("F", "test A");
p=&classB;
p->setProperty("F", "test B");
熟悉多态的朋友,马上就应该联想到这种机制的一些优越性。其中奥秘请看多类的相关描述,这里主要讲Qt的属性,不赘。

QObject::property/setProperty跟QMetaObject::propertyCount(),和QMetaObject::property()结合起来,可以实现动态的函数调用,类似于dotnet里的reflection机制。

4. 如果property的参数是enum,那么在定义Q_PROPERTY时,必须先告诉meta system使用的enum,使用宏Q_ENUMS,次序无关,如:

Q_PROPERTY(Priority priority READ priority WRITE setPriority)
Q_ENUMS(Priority)

其中Priority是枚举类型。

5.一个较为复杂的例子,使用了一个引用输入属性的写函数。请注意,此引用必须为const。

////CaliforniaWhiteWine.h
#include <QObject>

class WhiteWine
{};

class CaliforniaWhiteWine :
    public QObject
{
    Q_OBJECT
    Q_PROPERTY(WhiteWine& m_wine READ getWine WRITE setWine)
public:
    CaliforniaWhiteWine();
    CaliforniaWhiteWine(WhiteWine& wine);
    ~CaliforniaWhiteWine();

    WhiteWine& getWine() const;
    void setWine(const WhiteWine& wine)
    {
        delete m_wine;
        *m_wine = wine;
    }
protected:
    WhiteWine* m_wine;
};

////CaliforniaWhiteWine.cpp
#include ".californiawhitewine.h"

CaliforniaWhiteWine::CaliforniaWhiteWine(void)
{
    this->m_wine=new WhiteWine();
}

CaliforniaWhiteWine::~CaliforniaWhiteWine(void)
{
    delete m_wine;
}

CaliforniaWhiteWine::CaliforniaWhiteWine(WhiteWine& wine)
{
   
}

WhiteWine& CaliforniaWhiteWine::getWine() const
{
    return *m_wine;
}

qtcn.org

才发现一个新的中文Qt讨论站(www.qtcn.org)。站长有志于将Qt
4的文档翻译成中文。很好很有意义的工作,但工作量怕不小,是个漫长的过程。但Trolltech作为一个商业公司,如果她感觉有必要做成中文文档来吸引
中国的开发者的话,估计他们自己会做这事情,开源社区却不宜花太多时间在文档的翻译工作上面。只是国内的Qt coder不多,而且水平基本偏低。
也许多写一些中文的入门引导性的文章(即便是英文的,同样有意义),在目前来看,我感觉居于比较重要的位置。
技术论坛还是要写位在技术讨论上,不管是qtcn还是cngis。只是坚持下去不是件容易的事。
最近在study win32  api class -> Qt
class的转化,TT编程人员真是做了件了不起的工作。比如meta
compiling和Qt的wrapping都是值得写c++代码的人借鉴的技术。看到wxWidget讲,Qt的这种meta
compile导致Qt不是一种真正的纯c++。并不十分赞同。在meta
compile底层讲,预编译的效果是纯cpp,从较上层讲,能最大限度简化编程人员的工作量就是成功。
不过象wxWidget这样使用消息映射宏,也是不错的一种选择。估计是借鉴了mfc。没有太深钻研wxw,以后有时间再看。

GRASS/Qt

发现有人将GRASS包装成Qt库,可以在Qt程序里应用GRASS,
当然还是很初步的东西,目前的功能包括:
1.
对层(layers)的着色进行控制
2. 在painter上面显示2维的矢量和栅格图形
3. 放大缩小
4. 漫游
5.
xy到经纬度的转换
6. 两点间距离的量算
详细请见
http://navicon.dk/web/normal.php?pageid=92

一个Qt论坛

发现一个Qt相关的技术论坛,很好!
这是地址:http://prog.org.ru/forum/forum_14_293a41060711d9f8a71a60fe1e5e890e.html
另外,俄罗斯的盗版好象比中国的还要厉害,很多新软件,在google.ru上都能找着破解

一 个小 tip,特别是找软件破解的时候,不妨除了用google.com,也用用google.ru等区域性的搜索,也许会带给你惊喜;另外最新的软件一般都出 现在eDonkey上面,所以不要忘了到eDonkey上找找(这不是bt可以替代的,eDonkey上的资源很丰富,当然内容也是乱七八糟的,就看大家 如何对待了)。

revised lineEdit

目的:当第一次鼠标点到lineEdit的时候,自动将全部的text选上,而不是默认的将光标置于某个位置
解决方法:重载focusInEvent
难点:click时产生QFocusEvent和MousePressEvent,然后MousePressEvent的处理在focusInEvent之后,所以即便将focuseInEvent重载后,mouse event还是会将光标置到点击的位置,而不是选定全部。这时首先判断是否因为mouse focus造成的,如是的话,由重新发送一个由tab引发的focus in(默认的tab引起的focus是全部选定)。这样就ok了。
 
Purpose: when the first time of clicking the line edit widget, the whole text will be selected, other than the default action, which would insert the cursor in a certain position in the line edit.
Solution: override the focusInEvent virtual method.
Points to be specially addressed:  In a normal way, when the focus changed by the mouse clicking, the default action includes (1) invoking focusIn event which in turn calls the focusInEvent, and (2) normal mouse event which inserts the cursor into a proper position. This will bring a problem, whatever you set the focusInEvent event (for ex., call selectionAll to select all the text) , the normal mouse event will move the cursor to a certain position. A workaround is listing as following:  first check the reason causing the focus change, if it’s due to mouse click, then post in the event queue a tab focus event which by defaut will select all the text in a line edit widget.  
 
 
 
代码:
void PmFocusHandledLineEdit::focusInEvent( QFocusEvent * event )
{
  if (event->reason()==Qt::MouseFocusReason)
  {
    QFocusEvent *fe=new QFocusEvent(QEvent::FocusIn, Qt::TabFocusReason);
    QApplication::postEvent(this, fe);
  }
  else
  {
    QLineEdit::focusInEvent(event);
  }
}