2016-07-19 10 views
0

私は別のクラスFooのインスタンスへの参照を保持するC++クラスBarを持っています。 Barのメソッドが呼び出されると、FooインスタンスでQML信号を送出します。私は20年でC++でコード化していないし、QMLがシグナルを出すために使う構文は私を混乱させる。QQuickItem参照で信号を出力する

foo.hという

#include <QOpenGLFramebufferObject> 
#include <QQuickFramebufferObject> 
class Bar; 

class Foo : public QQuickFramebufferObject { 
    Q_OBJECT 
public: 
    Foo(); 
    virtual ~Foo(); 
signals: 
    void huzzah(); 
private: 
    Bar &bar; 
}; 

 

Foo.cpp

#include "Foo.h" 
... 
class Bar: public QObject { 
    Q_OBJECT 
public: 
    Bar(); 
    ~Bar(); 
    void SetItemAttached(QQuickItem &inItem); 

public slots: 
    void BeforeRender(); 

private: 
    QQuickItem *foo; 
}; 

void Bar::SetItemAttached(QQuickItem &inItem) { 
    foo = &inItem; 
} 

//************************************************ 
//* When this method is called I want to emit a 
//* signal on foo, not on the bar instance. 
//************************************************ 
void Bar::BeforeRender() { 
    // I really want something like foo.emit(...) 
    emit huzzah(); 
} 

Foo::Foo() : bar(*new Bar()) { 
    bar.SetItemAttached(*this); 
} 

Foo::~Foo() { 
    delete &bar; 
} 

どのようにfoo上の信号を発するように上記BeforeRender()方法でコードを変更することができ?私の周り

(新しいツーQML)C++プログラマは、私がBarはダミー信号を発する必要があり、その後、Fooに信号を発するFoo上のスロットに接続しなければならないことを言います。これは唯一の(または最良の)方法ですか?

+0

また、BarにFooの信号を直接送信することもできます: 'emit foo-> huzzah()'。しかし、FooをQQuickItem( 'foo'の型は' QQuickItem * ')として保存すると、' foo'がそのシグナルを持っていることをコンパイラが正当に知ることができないので、直接行うことはできません。だから、 'Foo *'として保存するか、ダウンキャストが必要です( 'foo'が' Foo'でない場合は 'qobject_cast'、結果を確認する必要があります。あなたが正しいタイプで最初に保管しないのはなぜでしょうか?) – peppe

+0

ありがとう、@peppe。なぜそれが汎用QQuickItemであるのかわかりません。私はそれをより具体的にするために置き換え、構文は完全に機能します。答えにあなたのコメントを書いて、私がそれを受け入れるかもしれないことを示唆してもいいですか? – Phrogz

答えて

1

class Barを更新してください。 QQuickItem *foo;の代わりにFoo *foo;を使用してください。

関連する問題