• 6558阅读
  • 4回复

关于宏和Q_PROPERTY,请教各位 [已解决, 有解决方案] [复制链接]

上一主题 下一主题
离线foxyz
 

只看楼主 正序阅读 楼主  发表于: 2009-02-03
— 本帖被 XChinux 执行加亮操作(2009-02-04) —
我有个应用,需要自己写一些控件,举个例子:
比如,一个RadioButton,我继承自QRadioButton,同时我要在自己的类里加入数据库访问参数的property
一般是:
Q_PROPERTY(QString dbName READ dbName WRITE setDbName)
...
由于要通过designer来plugin 我的widgets,无法使用组合(白痴的designer不支持自定义类型)
继承也没法用,因为如果要用多继承,由于均来自一个父类(diamond interitance).

这样,我的笨办法是:在我的每个写的控件中都添加一遍类似上边的Q_PROPERTY及相关的functions
为了起码的可维护性,我打算用宏的,现在就有问题一:
这个Q_PROPERTY比较神奇,竟然不能嵌套,我所能找到的定义部分没搞明白。是这样的:
#define Q_PROPERTY(text) Q_PROPERTY(text)
哪位能告诉我实际的Q_PROPERTY定义是什么?
我本来打算定义个宏 #define DB_PROPERTY Q_PROPERTY(...) ......

第二个问题是:还有什么好办法呢?
[ 此贴被foxyz在2009-02-05 13:33重新编辑 ]
离线foxyz

只看该作者 4楼 发表于: 2009-02-04
说明一下,我的环境是:sun os10+sunstudio12
离线foxyz

只看该作者 3楼 发表于: 2009-02-04
多谢回帖!
问题找到了,解决办法也找到了。

问题原因是这样的:经过翻看moc.cpp,终于明白了这几个宏除了是宏外,moc对*.h文件进行解析的时候,这个Q_PROPERTY还是一个标志串,所以宏替换显然是无法成功的,因为你宏替换了,moc就没办法解析了。

解决办法也比较简单,我把这几条Q_PROPERTY单独写在一个header file 里,比如:
commonProperties.h
Q_PROPERTY(...)
Q_PROPERTY(...)

然后在需要插入的地方include就OK,比如:
class mywidget : public QRadioButton {
    Q_OBJECT
#include "commonProperties.h"
...
...

}
离线wd007

只看该作者 2楼 发表于: 2009-02-04
还有看看有没有破解的商业版本的第三方控件,也许不用自己写。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线wd007

只看该作者 1楼 发表于: 2009-02-04
Q_PROPERTY ( ... )
This macro declares a QObject property. The syntax is:
Q_PROPERTY(type name
            READ getFunction
            [WRITE setFunction]
            [RESET resetFunction]
            [DESIGNABLE bool]
            [SCRIPTABLE bool]
            [STORED bool])
For example:
Q_PROPERTY(QString title READ title WRITE setTitle)
See also Qt's Property System.

帮助里面是上面这样写的
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
快速回复
限100 字节
 
上一个 下一个