Yearly Archives: 2005

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);
  }
}

一个Switzerland的博后机会

水文模型方向,做海河流域
有兴趣的朋友请与他们联系。详细见附件

点击这里

声明一下,我只帮他们做了个广告,我也不认识对方是什么人,所以我也无能为力,帮不上。大家可以直接通过附件里的方式跟对方联系。

about W’s graduate

尽管说兰州不好,很多方面比不上北京,但毕竟这里有熟悉的同事和领导,和自己熟悉的业务。很是希望他能留下,大家相补有无,相信还是能做出东西来的。不一定要是什么大成果,至少踏实干活了也无愧于自己。