Qt Q_Property给出了编译时错误

时间:2015-01-09 10:59:45

标签: c++ qt

我是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

3 个答案:

答案 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 ...
}

然后,您可以删除或制作您的二传手功能protectedprivate。或者,您可以继续使用您的setter,从而阻止读取访问:

 Q_PROPERTY(int width WRITE setWidth)

之后,使用QT函数访问m_width值。例如。在main

Rectangle r;
r.setProperty("width", 8);

答案 2 :(得分:1)

如果使用Q_PROPERTY

启动课程

class Rectangle : public QObject
 {
     Q_OBJECT
...