Qt / Qml:自定义小部件 - 无法设置“宽度”属性,因为它是只读的

时间:2016-09-08 21:30:06

标签: c++ qt qml qt5

我创建了一个名为qmlRegisterType的自定义窗口小部件,我已在OpenGLWidget { id: glwidget width: parent.width } 函数中注册。

嵌套在Qml文件中,我有这个:

width

我的应用程序死了,说OpenGLWidget是一个只读属性。

我也尝试将此行添加到Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged) 标题文件中:

Q_PROPERTY

(但是,即使这些方法不存在,代码仍会编译 - 为什么?)

无论如何,在我看来,如果您想要添加自己的自定义属性,我会使用x,但ywidthheight,{{ 1}}等等(都是readonly)应该是内置的,不是吗?

根据请求编辑OpenGLWidget头文件。

#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H

#include <QObject>
#include <QGLWidget>

class OpenGLWidget : public QGLWidget
{
    Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged)

public:
    OpenGLWidget();

    void setWidth(int width) { resizeGL(width, this->geometry().height()); }
    void widthChanged(int width) { }

protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);
};

#endif // OPENGLWIDGET_H

1 个答案:

答案 0 :(得分:1)

您的班级缺少Q_OBJECT宏。这会导致Qt元对象系统将其视为最接近定义宏的超类,缺少方法覆盖。

Q_OBJECT行之前添加Q_PROPERTY行(需要它以便构建系统知道为此类运行 moc )。然后手动运行 qmake (例如,从Qt Creator构建菜单中),因为此更改不会自动获取,因此Makefile不会自动更新。

最好使用Qt Creator新类向导将类添加到项目中,以避免出现类似的错误。