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
上のスロットに接続しなければならないことを言います。これは唯一の(または最良の)方法ですか?
また、BarにFooの信号を直接送信することもできます: 'emit foo-> huzzah()'。しかし、FooをQQuickItem( 'foo'の型は' QQuickItem * ')として保存すると、' foo'がそのシグナルを持っていることをコンパイラが正当に知ることができないので、直接行うことはできません。だから、 'Foo *'として保存するか、ダウンキャストが必要です( 'foo'が' Foo'でない場合は 'qobject_cast'、結果を確認する必要があります。あなたが正しいタイプで最初に保管しないのはなぜでしょうか?) – peppe
ありがとう、@peppe。なぜそれが汎用QQuickItemであるのかわかりません。私はそれをより具体的にするために置き換え、構文は完全に機能します。答えにあなたのコメントを書いて、私がそれを受け入れるかもしれないことを示唆してもいいですか? – Phrogz