Yearly Archives: 2005

QMenu popup strange behavior

thanks to bubu @ qtforum.org

If you need to use all available screen, then you must look up in qmenu.cpp source file in 1273 line where is:
QRect screen = QApplication::desktop()->availableGeometry(p);
Change it to:
QRect screen = QApplication::desktop()->screenGeometry(p);
then it works like you need

Yes, it does!


TrayIcon for Qt4

把最核心的帖在这里
//credit to Jason Stubbs @ qt-interest
static HICON createIcon( const QPixmap &pm, HBITMAP &hbm )
{
 ICONINFO iconInfo;
 iconInfo.fIcon    = TRUE;
 iconInfo.hbmMask  = hbm = pm.createMaskFromColor(Qt::black).toWinHBITMAP();
 iconInfo.hbmColor = pm.toWinHBITMAP(QPixmap::PremultipliedAlpha);
 HICON icon = CreateIconIndirect( &iconInfo );
 DeleteObject(iconInfo.hbmMask);
 iconInfo.hbmMask = hbm = 0; // michalj
 return icon;
}
发现一点小问题,在如下代码里:
void TrayIcon::mouseReleaseEvent( QMouseEvent *e )
{
#ifdef Q_OS_WIN
// This is for Windows, where menus appear on mouse release
 switch ( e->button() ) {
  case Qt::RightButton:
   if ( pop ) {
    // Necessary to make keyboard focus
    // and menu closing work on Windows.
    pop->activateWindow();
    pop->exec( e->globalPos());
    pop->activateWindow();
    e->accept();
   }
   break;
   …
 }
#endif
 e->ignore();
}
pop->exec( e->globalPos()); 点在任务栏的system tray位置上,弹出来的菜单居然在任务栏上沿,而不是从鼠标点的位置上弹出。如图比较了 msn弹出菜单和这个system tray弹出菜单。看了一下QMenu源码,好象是Qt专门做的,但好象就不是那么native的感觉了。红点是鼠标点的位置。
不知道有没有人有workaround?
 

about Qtcn

Qtcn目前好象还差的比较远,缺少真正懂qt的人,可笑的这两天还在讨论c++里的class和struct,居然有这么多人搞不清楚,还固执的可笑。

F.
Wu给我写信说,qtcn他看了一下,暂时不想去,还没有形成讨论问题的氛围,有的只是几个可笑的连c/c++还搞不清楚的人在讨论幼稚的问题。将我也骂
进里面去了,我居然还在struct和class里发了好几个帖子,想使他们搞明白是怎么回事,结果被人胡搞蛮缠,成了谩骂的帖子了。只是我从来没在一个
技术论坛上会看到这种情况,不仔细研究别人给的答案,单凭自己的可怜的一点知识来判定回帖人的对错,这种后果是很可怕的,这样的风气也不可取,从个人讲妨碍个人的进步,从论坛上这种习惯会传染的。好在终于决定不再看这种帖子了。

c/c++应该是Qt的基础,c/c++没学好,学习Qt会有较大的问题。

重载最小化的默认behavior

花了整整一天的时间!真是很不容易。首先,在event()里判定 type()==QEvent::WindowStateChange是不行的,(1)WindowStateChange在最小化完成后调用,(2) hide()在event()里调用,没有预期效果,表现在hide后居然还有icon在任务栏上。其次,在WindowStateChange前,会调 用hideEvent(),但重载hideEvent仍然不成,hide后在任务栏上仍有icon。
谢谢qtforum的bubu提示,他给出的方案是:
bool testMinimize::winEvent(MSG *message, long *result)
{
if (message->message == WM_SYSCOMMAND && message->wParam == SC_MINIMIZE) {
ShowWindow(winId(), SW_HIDE); //WinAPI
(*result) = false;
d->tray->show();
return true;
}

}
然后调用 ShowWindow(winId(), SW_SHOW);显示
但有一个不足,上述hide后,不能用QMainWindow::show()回来。我在bubu的基础上改了一下,如下:
bool testMinimize::winEvent(MSG *message, long *result)
{
if (message->message == WM_SYSCOMMAND && message->wParam == SC_MINIMIZE) {
// ShowWindow(winId(), SW_HIDE); //WinAPI
hide();
(*result) = false;
d->tray->show();
return true;
}
return QMainWindow::winEvent(message, result);
}
居然发现hide在winEvent里可以用。惊喜!这样就可以用QMainWindow::show()回来了。
感谢bubu at qtforum!

使得QDialog关闭的时候不自动退出

使得QDialog关闭的时候不自动退出
giscn[at]msn[dot]com

适用情况:当主窗口hide在后台,这时在trayIcon上打开一个about窗口,关闭此about
窗口,将自动退出整个程序。
原因:Qt 4.0.1自动将lastWindowClosed与quit()相连。而这时主窗口被隐藏,在关闭
about窗口时,因为检测到about窗口有WA_QuitOnClose属性,在about关闭后,继续检
测有无visible的带WA_QuitOnClose属性的窗口(lastWindowClosed),因为检测到没
有,所以激发quit(),从而退出。
solution: 在about dialog的合适位置(一般是constructor)加入
setAttribute(Qt::WA_QuitOnClose, false); 清除WA_QuitOnClose标志。这样在关闭
about时,不会继续检测lastWindowClosed,从而不激发quit。

subVersion定制

建立了heihedss, pm 和meta三个repository,对结构进行了一些设计
对基于regular web browser的输出进行了定制,从subversion源码包里取到toolssvnindex.xsl,在httpd.conf的svn Location段里增加了

<Location /svn>

DAV svn

SVNParentPath /usr/local/svn

SVNIndexXSLT "/svnindex.xsl"

</Location>

效果见如附图
Url: http://503.mygis.org

几个svn命令

create a user and user file:
binhtpasswd -c pwd-file <username>

add user to user file:
binhtpasswd pwd-file <username>

create bdb repository:
svnadmin create –fs-type bdb <newRepository>
svnadmin create –fs-type fsfs <newRepository>

backup repository:
svnadmin hotcopy path/to/repository path/to/backup –clean-logs

subVersion 1.2.3 & Apache 2.0.54

1. 下载apache 2.0.54-win32 installer版 (http://httpd.apache.org/download.cgi),安装
note: 如果已开iis,先禁止之。

2. 下载svn-win32-1.2.3.zip,

http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
2.1 解压缩至 c:program filessvn-win32-1.2.3目录
2.2 将sharelocale下面的删除掉,zh-CN在xp下运行不正常

3. 创建repository
svnadmin create d:/projects/pm

4. copy bin/mod_authz_svn.so 和bin/mod_dav_svn.so 到C:Program FilesApache

GroupApache2modules目录下
将bin/*.dll 复制 %apachedir%bin(实际上只要/bin/libdb43.dll复制过去就可以)

4.1 打开C:Program FilesApache GroupApache2conf下的httpd.conf
4.2 在# Dynamic Shared Object (DSO) Support段下,增加
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
note: 这两句必须加在 LoadModule dav_module modules/mod_dav.so之后,如果该语句被注释,则去掉注释;将dav_fs_module modules/mod_dav_fs.so的注释也去掉。

4.3 配置repository
htpasswd -cm d:/svn/svn-auth-file tong
new password:
confirm password:
htpasswd -m d:/svn/svn-auth-file new_user

在httpd.conf最后增加
#configuration for subVersion
<Location /svn>
    DAV svn
    SVNParentPath d:/svn
    AuthType Basic
    AuthName "Subversion repository"
    AuthUserFile d:/svn/svn-auth-file
    Require valid-user
    AuthzSVNAccessFile d:/svn/svn-access-file   
</Location>

svn-access-file结构

[svn1:/]               //这表示,仓库svn1的根目录下的访问权限
harry = rw             // svn1仓库harry用户具有读和写权限
sally = r               // svn1仓库sally用户具有读权限
[svn2:/]               //svn2仓库根目录下的访问权限
harry = r               // harry用户在svn2仓库根目录下只有读权限
sally =               // sally用户在 svn2仓库根目录下无任何权限
#[/]               // 这个表示在所有仓库的根目录下
#* = r               // 这个表示对所有的用户都具有读权限
#[groups]               // 这个表示群组设置
#svn1-developers = harry, sally           // 这个表示某群组里的成员
#svn2-developers = sally
#[svn1:/]           
#@svn1-developers = rw       // 如果在前面加上@符号,则表示这是个群组权限设置

5. 重启apache server
http://503.mygis.org/svn/测试

本文参考subversion 3.1.2 INSTALL, README
Qt中文论坛(qtcn.org)"Subversion版本管理器简单配置说明" by XChinux

得到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发现的,然后转告于我。如有不妥,请告知,即刻删除。

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

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


第一幕:逼上悬崖

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

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

幕后:小龙女的真面目

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

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

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

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

回忆:跳崖之路

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

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

第二幕:跳下去了

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

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

  围观的人越来越多。

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

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

第三幕:结局

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

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