Category Archives: Qt
QMenu popup strange behavior
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
static HICON createIcon( const QPixmap &pm, HBITMAP &hbm )
{
iconInfo.fIcon = TRUE;
iconInfo.hbmMask = hbm = pm.createMaskFromColor(Qt::black).toWinHBITMAP();
iconInfo.hbmColor = pm.toWinHBITMAP(QPixmap::PremultipliedAlpha);
DeleteObject(iconInfo.hbmMask);
iconInfo.hbmMask = hbm = 0; // michalj
return icon;
}
{
#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();
}
about Qtcn
F.
Wu给我写信说,qtcn他看了一下,暂时不想去,还没有形成讨论问题的氛围,有的只是几个可笑的连c/c++还搞不清楚的人在讨论幼稚的问题。将我也骂
进里面去了,我居然还在struct和class里发了好几个帖子,想使他们搞明白是怎么回事,结果被人胡搞蛮缠,成了谩骂的帖子了。只是我从来没在一个
技术论坛上会看到这种情况,不仔细研究别人给的答案,单凭自己的可怜的一点知识来判定回帖人的对错,这种后果是很可怕的,这样的风气也不可取,从个人讲妨碍个人的进步,从论坛上这种习惯会传染的。好在终于决定不再看这种帖子了。
c/c++应该是Qt的基础,c/c++没学好,学习Qt会有较大的问题。
重载最小化的默认behavior
谢谢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关闭的时候不自动退出
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。
得到russian一个朋友给的qt 4.01 patch
2. 下载patch
3. 安装qt eval
4. 将patch的内容解压缩到bin目录下
5. ok
声明,本人使用opensource版,且准备要购买Qt 4.x,本信息只是在网上看着了,转帖一下,而patch是russia的朋友在rapidshare发现的,然后转告于我。如有不妥,请告知,即刻删除。
Qt 4.0.1 signal的模板参数问题
面编译通不过,即便第二个参数是int这样的简单类型,也不行。但如果只有一个参数
(即模板参数),可以正常通过。Qt 4.0.0没有这个问题。
解决方案:通过typedef将模板参数定义成一个别名。编译通过。
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
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,以后有时间再看。