• 11425阅读
  • 5回复

[提问]Q_PROPERTY宏无法使用,报出'xxx' was not declared in this scope【已解决】 [复制链接]

上一主题 下一主题
离线小怪兽
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-06
我使用的是Qt SDK for Windows*,QT版本是4.7.0,MinGW编译
查看assistant介绍Q_PROPERTY使用方法后编写测试类:

#ifndef BASEOBJECT_H
#define BASEOBJECT_H

#include <QObject>

public BaseObject : public QObject
{
Q_OBJECT
Q_PROPERTY(double weight READ weight WRITE setWeight)
public:
explicit BaseObject(QObject *parent = 0);
~BaseObject();
};

#endif

编译的时候,报出错误:
debug\moc_baseobject.cpp: In member function 'virtual int WorldView::qt_metacall(QMetaObject::Call, int, void**)':
debug\moc_baseobject.cpp:75: error: 'weight' was not declared in this scope
debug\moc_baseobject.cpp:78: error: 'setWeight' was not declared in this scope

mingw32-make[1]: Leaving directory `E:/CodeSource/QWorldEngine-build-desktop'
mingw32-make: Leaving directory `E:/CodeSource/QWorldEngine-build-desktop'
mingw32-make[1]: *** [debug/moc_baseobject.o] Error 1
mingw32-make: *** [debug] Error 2

是环境设置问题还是其它?如果我删除Q_PROPERTY这行代码编译就没有问题。请问有人知道错误原因吗?
[ 此帖被小怪兽在2011-04-09 12:20重新编辑 ]
离线jdwx

只看该作者 1楼 发表于: 2011-04-07
class MyClass : public QObject
{
     Q_OBJECT
     Q_PROPERTY(Priority priority READ priority WRITE setPriority)
     Q_ENUMS(Priority)

public:
     MyClass(QObject *parent = 0);
     ~MyClass();

     enum Priority { High, Low, VeryHigh, VeryLow };

     void setPriority(Priority priority);
     Priority priority() const;
};

MyClass *myinstance = new MyClass;
QObject *object = myinstance;

myinstance->setPriority(MyClass::VeryHigh);
object->setProperty("priority", "VeryHigh");
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线roywillow

只看该作者 2楼 发表于: 2011-04-07
这个宏我也总是理解不能啊……
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
之后会自动生成一个类型为Priority,名称为priority的私有成员变量?
然后还要保证下面有成员函数priority() const和setPriority(Priority)?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 3楼 发表于: 2011-04-07
引用第2楼roywillow于2011-04-07 08:49发表的  :
这个宏我也总是理解不能啊……
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
之后会自动生成一个类型为Priority,名称为priority的私有成员变量?
然后还要保证下面有成员函数priority() const和setPriority(Priority)?

呵呵,说明你没有使用它的需求。如果你想感受它的作用,不妨先去接触一下 QtScript 或 PySide、PyQt4 等脚本。
离线小怪兽
只看该作者 4楼 发表于: 2011-04-08
原来是需要定义函数,那么如果定义的property不是枚举而是成员呢?

例如:
Q_PROPERTY(QString title READ title WRITE setTitle USER true)
public:
QString title() const;
void setTitle(QString);

接下来在实现文件中:
QString ClassName::title() const
{
    // return what?
}
这里该返回什么呢?我尝试使用this->title,编译时缺报错了,提示成员不可用。
离线小怪兽
只看该作者 5楼 发表于: 2011-04-09
仔细看了看帮助文档,总算大概弄清楚使用方法和用途了,下面简单叙述一下:

Q_PROPERTY宏举例:

Q_OBJECT
Q_PROERTY(double height READ height WRITE setHeight)

public:
double height() const { return m_height; }
void setHeight(double h) { m_height = h; }

private:
    double m_height;

对于该类实例之外的函数调用使用Class::height()和Class::setHeight()。
包括NOTIFY标识也同样需要自己实现的,如果没有其它需求的话与普通的没有任何区别。
唯一不同的是,当使用Q_PROPERTY标记了某属性后,就可以使用Meta-Object System进行动态属性调整。

也就是说,Q_PROPERTY并不会像C#一样简化属性函数相关的操作。而对于动态属性,更多的属于python风格而已,个人感觉对于C++意义不大。
快速回复
限100 字节
 
上一个 下一个