首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt/Qml:自定义小部件--无法设置“宽度”属性,因为它是只读的

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

Stack Overflow用户
提问于 2016-09-08 21:30:05
回答 1查看 687关注 0票数 1

我已经创建了一个名为OpenGLWidget的定制小部件,我已经在qmlRegisterType函数中注册了它。

嵌套在Qml文件中,我有以下内容:

代码语言:javascript
运行
复制
OpenGLWidget {
  id: glwidget
  width: parent.width
}

我的应用程序死后说width是一个只读属性。

我还尝试将这一行添加到OpenGLWidget头文件中:

代码语言:javascript
运行
复制
Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged)

(然而,即使没有这些方法,代码仍然编译-为什么?)

无论如何,在我看来,如果您想添加您自己的自定义属性,就会使用Q_PROPERTY,但是像xywidthheight等属性(它们都是只读的)应该内置,不是吗?

编辑:OpenGLWidget头文件应请求。

代码语言:javascript
运行
复制
#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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-08 22:05:50

您的类缺少了Q_OBJECT宏。这导致Qt元对象系统将其视为定义宏的最接近的超类,而忽略了方法重写。

Q_OBJECT行之前添加Q_PROPERTY行(因此构建系统知道如何为该类运行moc )。然后手动运行qmake (例如。在Qt构建菜单中),因为此更改不会自动获取,因此Makefiles不会自动更新。

使用Qt新类向导将类添加到项目中是个好主意,以避免像这样简单的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39400514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档