Qt Q_Property 给出编译时错误
Qt Q_Property gives a compile time error
我是 Qt 和 C++ 的新手,但已经是 Delphi 程序员了。
我有一个简单的 class,我正在尝试将 属性 添加到:
class Rectangle {
Q_PROPERTY(int width READ m_width WRITE m_width )
public:
void setWidth(int x) {m_width = x;}
void setHeight(int x){m_height = x;}
void setValues (int,int);
int area() {return m_width * m_height;}
private:
int m_width, m_height;
};
void Rectangle::setValues (int x, int y) {
m_width = x;
m_height = y;
}
主要我有:
Rectangle r;
r.setWidth(7);
// r.width = 8;
r.setHeight(3);
qDebug() << r.area();
这工作正常,输出 21(哇哦,我可以做 7 x 3)。但是当我取消注释行 r.width = 8;我收到一条错误消息:
" C2039: 'width' : 不是 'Rectangle' 的成员 "
我做错了什么?
编辑:我使用的是 Qt 5.4.0 和 QtCreator 3.3.0
请阅读 this 以获得 QT 属性 系统的简要概述。
您需要添加 QObject
作为基础 class,并更改您的 Q_PROPERTY
行:
class Rectangle : public QObject
{
Q_OBJECT
Q_PROPERTY(int width MEMBER m_width)
// Rest of your code ...
}
然后您可以删除 setter 函数或将其设为 protected
或 private
。或者,您可以继续使用 setter,从而阻止读取访问:
Q_PROPERTY(int width WRITE setWidth)
之后,使用QT函数访问m_width
值。例如。在 main
:
Rectangle r;
r.setProperty("width", 8);
启动 class 如果使用 Q_PROPERTY
class Rectangle : public QObject
{
Q_OBJECT
...
- 继承自
QObject
- 将
Q_OBJECT
宏包含到您的 class 正文中
在Q_PROPERTY
READ/WRITE属性中使用setter/getter成员函数,而不是成员变量。
class Rectangle : public QObject
{
Q_OBJECT
Q_PROPERTY(int width READ width WRITE setWidth)
public:
void setWidth ( int width )
{
m_width = width;
}
int width () const
{
return m_width;
}
private:
int m_width;
};
或者,您也可以在 Q_PROPERTY
中使用 MEMBER
关键字(虽然我个人从未使用过)
class Rectangle : public QObject
{
Q_OBJECT
Q_PROPERTY(int width MEMBER m_width)
public:
/*
// not needed anymore if you only want to use it via the QObject property API
void setWidth ( int width )
{
m_width = width;
}
int width () const
{
return m_width;
}*/
private:
int m_width;
};
我是 Qt 和 C++ 的新手,但已经是 Delphi 程序员了。
我有一个简单的 class,我正在尝试将 属性 添加到:
class Rectangle {
Q_PROPERTY(int width READ m_width WRITE m_width )
public:
void setWidth(int x) {m_width = x;}
void setHeight(int x){m_height = x;}
void setValues (int,int);
int area() {return m_width * m_height;}
private:
int m_width, m_height;
};
void Rectangle::setValues (int x, int y) {
m_width = x;
m_height = y;
}
主要我有:
Rectangle r;
r.setWidth(7);
// r.width = 8;
r.setHeight(3);
qDebug() << r.area();
这工作正常,输出 21(哇哦,我可以做 7 x 3)。但是当我取消注释行 r.width = 8;我收到一条错误消息:
" C2039: 'width' : 不是 'Rectangle' 的成员 "
我做错了什么?
编辑:我使用的是 Qt 5.4.0 和 QtCreator 3.3.0
请阅读 this 以获得 QT 属性 系统的简要概述。
您需要添加 QObject
作为基础 class,并更改您的 Q_PROPERTY
行:
class Rectangle : public QObject
{
Q_OBJECT
Q_PROPERTY(int width MEMBER m_width)
// Rest of your code ...
}
然后您可以删除 setter 函数或将其设为 protected
或 private
。或者,您可以继续使用 setter,从而阻止读取访问:
Q_PROPERTY(int width WRITE setWidth)
之后,使用QT函数访问m_width
值。例如。在 main
:
Rectangle r;
r.setProperty("width", 8);
启动 class 如果使用 Q_PROPERTY
class Rectangle : public QObject
{
Q_OBJECT
...
- 继承自
QObject
- 将
Q_OBJECT
宏包含到您的 class 正文中 在
Q_PROPERTY
READ/WRITE属性中使用setter/getter成员函数,而不是成员变量。class Rectangle : public QObject { Q_OBJECT Q_PROPERTY(int width READ width WRITE setWidth) public: void setWidth ( int width ) { m_width = width; } int width () const { return m_width; } private: int m_width; };
或者,您也可以在
Q_PROPERTY
中使用MEMBER
关键字(虽然我个人从未使用过)class Rectangle : public QObject { Q_OBJECT Q_PROPERTY(int width MEMBER m_width) public: /* // not needed anymore if you only want to use it via the QObject property API void setWidth ( int width ) { m_width = width; } int width () const { return m_width; }*/ private: int m_width; };