2016-09-08 13 views
1

qmlRegisterType関数で登録したOpenGLWidgetというカスタムウィジェットを作成しました。 QMLファイルの中にネストQt/Qml:カスタムウィジェット - 読み込み時に「幅」プロパティを設定できません

は、私はこれを持っている:

OpenGLWidget { 
    id: glwidget 
    width: parent.width 
} 

私のアプリはwidthが読み取り専用プロパティであることを言って死にます。

私はまたOpenGLWidgetヘッダファイルに次の行を追加しようとしている:

Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged) 

(これらのメソッドが存在しない場合でも、しかし、コードはまだコンパイルする - なぜ?)

をとにかく、あなた自身のカスタムプロパティを追加したい場合、xywidthheightなどのプロパティ(すべて読み取り専用)は組み込まれている必要がありますか?いいえ、Q_PROPERTYが使用されていますか?

EDIT: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 
+0

少なくともOpenGLWidgetクラス定義のソースコード(.hファイル)が必要です(多くの場合、無関係なプライベートメンバーが削除されている可能性があります)。 – hyde

+0

@hyde修正済み、私の編集を参照してください。 – Tobias

答えて

1

クラスにQ_OBJECTマクロがありません。これにより、Qtメタオブジェクトシステムは、マクロが定義された最も近いスーパークラスであると考えるようになり、メソッドオーバーライドがありません。

Q_PROPERTYライン(ビルドシステムは、このクラスのMOCを実行するために知っているように、それが必要とされる)前にQ_OBJECT行を追加します。この変更は自動的に選択されないので、qmakeを手動で実行します(Qt Creatorのビルドメニューなど)。自動的にMakefileが更新されないためです。

Qt Creatorの新しいクラスウィザードを使用して、このような間違いを避けるためにプロジェクトにクラスを追加することをお勧めします。

+0

OK、説得力のある説明のようです、ありがとう!私は試してみるとすぐにこの回答を受け入れます。しかし、いくつかの質問があります:1)別の人が、Qt Quickであるので、代わりに 'QQuickFramebufferObject'を使い、ウィジェットではないことを教えてくれました。したほうがいい? 2)すべての 'width'呼び出しを基本クラスのメソッドに転送したいだけですが、これは可能ですか? – Tobias

+0

@Tobias 1.実際に持っている理由がない場合は、Qt Quickアプリケーションからウィジェットモジュールを削除してみてください(ちょっと小さく、シンプルにするなど)。だからええ。 2.メソッドをオーバーライドしない場合は、基本クラスのメソッドが呼び出されます。オーバーライドしたいが、そこから基本クラスのメソッドを呼び出す場合、そのためのC++の構文は* BaseClass :: method(); * – hyde

関連する問題