2009年5月6日星期三

本博客迁往 http://www.cuteqt.com/blog

新地址为http://www.cuteqt.com/blog

2009年4月1日星期三

QtCreator中编译qvfb失败的原因

从qtsoftware.com上下载下来的sdk包,并没有将qvfb直接编译进去。
如果在qtsdk-2009.01/qt/tools/qvfb执行qmake,然后make的话,会提示
qvfb.cpp:51:24: error: deviceskin.h: No such file or directory
qvfb.cpp:261: error: ‘DeviceSkinParameters’ was not declared in this scopeq
vfb.cpp:261: error: expected `;' before ‘parameters’
qvfb.cpp:263: error: ‘parameters’ was not declared in this scope
原因就在于DeviceSkin的代码没有被加入编译qvfb的工程

31 qvfbprotocol.cpp \
32 qvfbshmem.cpp \
33 qvfbmmap.cpp \
34 qlock.cpp \
35 qwssignalhandler.cpp
36
37 #include($QT_SOURCE_TREE/tools/shared/deviceskin/deviceskin.pri)
38 include(/home/bug/qtsdk-2009.01/qt/tools/shared/deviceskin/deviceskin.pri)
39
40 contains(QT_CONFIG, opengl) {
将37行的代码改成38行的样子就可以了,或者你将$QT_SOURCE_TREE的变量设置好了也可以

2009年3月14日星期六

在S60模拟器上的编译Qt

照着网上的帮助编译了一遍,一路很顺利,没出现什么问题

首先要下载用于Symbian版本的Qt包
当当当,请看这里http://pepper.troll.no/s60prereleases/
把第一个链接地址,也就是http://pepper.troll.no/s60prereleases/packages/qt-embedded-s60-commercial-src-4.5.0-
garden.zip 包给下载下来,然后减压缩
我将其减压缩到C:\qts60目录,然后就可以照着C:\qts60\doc\html\install-s60.html 的帮助做了,这个帮助和上头的第三个链接 http://pepper.troll.no/s60prereleases/doc/install-s60.html 是一样的。

接下来要下载两个包
Carbide.c++: http://www.forum.nokia.com/main/resources/tools_and_sdks/carbide_cpp/
S60SDK: http://www.forum.nokia.com/main/resources/tools_and_sdks/S60SDK/
剩下的那个"Open C/C++"不用下载了,因为通过上面的S60SDK地址,能够下到5th版,比3rd高级还有下面提到了两个update,一个是用不着的,一个给字体用的,我也没有下载。

接下来的事情就是安装 Carbide 和 S60SDK, 没什么好介绍的。双击安装即可,最好安装到和刚才的QtS60在同 一个分区里。在安装S60SDK的时候会提示有java和perl的什么包需要安装,那就点安装。如果有意外,对应的帮助可以在C:\qts60\doc\html\s60-with-qt-introduction.html 里找到

---------------华丽的分割线之后开始编译Qt---------------------
1. 将qt的bin路径(c:\qts60\bin)加到系统的PATH里,方法为"Control Panel->System->Advanced->Environment variables",这样在windows的命令行里能使用qmake等
命令
2.将S60模拟器的命令加进来,这个有图形化的方法"Start->Programs->Carbide.c++ v2.0->Configure environment for WINSCW command line"
3.配置(configure)Qt的编译选项cd C:\qts60configure -platform win32-mwc -xplatform symbian-abld
4.执行编译make debug-winscw
5. 完事,可以运行了,
在C:\S60\devices\S60_5th_Edition_SDK_v1.0\epoc32\release\winscw\udeb 目录下双击编译好的应用程序(C:\S60是我安装S60SDK的路径),比如wiggly.exe(来自于example\wiggly.exe),自动会启动模拟器运行

6.如果要测试自己的程序,可以在example目录下建立一个新目录,依葫芦画瓢的建一个.pro文件执行qmakemake debug-winscw同样会生成自己的应用在C:\S60\devices\S60_5th_Edition_SDK_v1.0\epoc32\release\winscw\udeb目录下

2009年3月10日星期二

Qt 不支持在Mac中的鼠标中键(滚轮)拖动

有人问起这个问题,虽然我不用Mac但是代码中有证据表明,所言属实。

503 Qt::DropAction QDragManager::drag(QDrag *o)
504 {
505 if(qt_mac_in_drag) { //just make sure..
506 qWarning("Qt: Internal error: WH0A, unexpected condition reached");
507 return Qt::IgnoreAction;508 }
509 if(object == o)
510 return Qt::IgnoreAction;
511 /* At the moment it seems clear that Mac OS X does not want to drag with a non-left button
512 so we just bail early to prevent it */
513 if(!(GetCurrentEventButtonState() & kEventMouseButtonPrimary))
514 return Qt::IgnoreAction;

除非重新设置你的kEventMouseButtonPrimary为中键,否则被忽略。

2009年3月9日星期一

如何使QDocWidget在QMainWindow中以tab页的形式布局

调用函数
void QMainWindow::tabifyDockWidget ( QDockWidget * first, QDockWidget * second )
帮助在此
http://doc.trolltech.com/4.5/qmainwindow.html#tabifyDockWidget
通过这种方法设置后还能通过鼠标拖动重新dock.

另外一种方法
void setDockOptions ( DockOptions options )
DockOptions使用 QMainWindow::ForceTabbedDocks,设置后就不能再拖动了。
参考 http://doc.trolltech.com/4.5/qmainwindow.html#DockOption-enum

2009年3月6日星期五

在.pro Qt工程文件中根据不同版本号使用不同源码

qmake里是不提供
#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0))
// ...
#endif
这种语法的

qmake的语法是
条件{
...执行的动作1...
}else{
...执行的动作2...
}

所以如果要执行根据版本控制的代码可以用
greaterThan(QT_MAJOR_VERSION, 4)|equals(QT_MAJOR_VERSION,4){
greaterThan(QT_MINOR_VERSION, 5)|equals(QT_MINOR_VERSION, 5){

message("bla,bla,bla ....")
}
}else{
message("pla,pla,pla ....")
}

不过需要注意的是,greaterThan和equals是在qmake代码里没有公布的,详细需要看qmake的源代码
qt/qmake/project.cpp
116 if(!qmake_test_functions) {
117 qmake_test_functions = new QMap;
118 qmake_test_functions->insert("requires", T_REQUIRES);
119 qmake_test_functions->insert("greaterThan", T_GREATERTHAN);
120 qmake_test_functions->insert("lessThan", T_LESSTHAN);
121 qmake_test_functions->insert("equals", T_EQUALS);
122 qmake_test_functions->insert("isEqual", T_EQUALS);

2009年2月23日星期一

Qt中事件处理的顺序

文章内容主要来自于这本书的第七章,做了点翻译和整理。

1.事件首先由Qt的ServerApplication去接收来自于外部或内部的一些行为,鼠标点击,键盘输入,时钟事件等,分析并决定送往对应的对象去处理(内部管理机制,如有机会另文分析),最后会调用bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) [virtual]去处理,当然这个是虚函数,你可以在子类去重新实现它 。

2.在notify(...)中,在发给对应的接收者前,会先把消息送给QApplication。所以如果想在你界面的Widget前先处理那些事件,那么你可以给QApplication对象installEventFilter,然后在对应的eventFilter()里先把这些事件都给过一遍,该和谐的先和谐掉。

3.如果QApplication没有处理那些事件,然后就是交给事件接收对象了。在这个对象接收前,也可以为这对象加一个事件过滤器,同样是installEventFilter,不过它的调用者是事件接收者(也就是前面那个reveiver参数),而不是QApplication/QCoreApplication.

4.经过了前面两级过滤后,如果事件还没被处理(前面函数的返回值为false),那么就会进入接收者的event()函数,你可以里面根据事件的不同类型尽情处理。

5.默认event()函数根据事件类型会调用不同的事件处理函数,类似mouseEvent(),keyEvent()去分别处理他们。

以上事件处理流程,由复杂的简单。至于每一步我们写代码的时候,都会怎么去用它,可以参考http://www.cnblogs.com/smoozer/archive/2009/02/09/1386704.html 这个哥们的翻译文章。