我是Qt和C ++的新手,但是很长一段时间是Delphi程序员。
我有一个简单的类,我正在尝试添加属性:
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
答案 0 :(得分:4)
QObject
Q_OBJECT
宏包含在您的课程正文中在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;
};
或者,您也可以使用MEMBER
中的Q_PROPERTY
关键字(虽然个人从未使用过它)
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;
};
答案 1 :(得分:1)
请阅读this,了解QT物业系统的简要概述。
您需要添加QObject
作为基类,并更改Q_PROPERTY
行:
class Rectangle : public QObject
{
Q_OBJECT
Q_PROPERTY(int width MEMBER m_width)
// Rest of your code ...
}
然后,您可以删除或制作您的二传手功能protected
或private
。或者,您可以继续使用您的setter,从而阻止读取访问:
Q_PROPERTY(int width WRITE setWidth)
之后,使用QT函数访问m_width
值。例如。在main
:
Rectangle r;
r.setProperty("width", 8);
答案 2 :(得分:1)
启动课程
class Rectangle : public QObject
{
Q_OBJECT
...