簡體   English   中英

Qt / Qml:自定義窗口小部件-無法設置“寬度”屬性,因為它是只讀的

[英]Qt/Qml: Custom widget — cannot set “width” property as it is readonly

我創建了一個名為OpenGLWidget的自定義小部件,該小部件qmlRegisterType函數注冊。

嵌套在Qml文件中,我有這個:

OpenGLWidget {
  id: glwidget
  width: parent.width
}

我的應用死於說width是只讀屬性。

我也嘗試將這一行添加到OpenGLWidget頭文件中:

Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged)

(但是,即使這些方法不存在,代碼仍然可以編譯-為什么?)

無論如何,在我看來,如果要添加自己的自定義屬性,則使用Q_PROPERTY ,但是應該將諸如xywidthheight等屬性(都是只讀的)內置,不是嗎?

編輯: 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

您的班級缺少Q_OBJECT宏。 這導致Qt元對象系統將其視為定義宏的最接近的超類,而缺少您的方法重寫。

Q_PROPERTY行之前添加Q_OBJECT行(這是必需的,以便構建系統知道為此類運行moc )。 然后手動運行qmake (例如,從Qt Creator構建菜單中),因為此更改不會自動獲取,因此Makefile不會自動更新。

最好使用Qt Creator的新類向導將類添加到項目中,以避免類似這樣的簡單錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM