Ich habe eine C++ - Klasse Bar
, die einen Verweis auf eine Instanz einer anderen Klasse Foo
enthält. Wenn eine Methode auf Bar
aufgerufen wird, möchte ich ein QML-Signal auf der Foo
Instanz ausgeben. Ich habe nicht in C++ in 20 Jahren codiert, und die Syntax, die QML verwendet, um Signale zu emittieren, verwirrt mich.Emittieren Sie ein Signal auf eine QQuickItem-Referenz
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;
}
Wie kann ich den Code in BeforeRender()
obigen Verfahren modifizieren, um ein Signal auf foo
auszusenden ?
Die (neue-to-QML) C++ Programmierer um mich sagen, dass ich Bar
ein Dummy-Signal aussenden muß, und es dann auf Foo
zu einem Schlitz anschließen, der ein Signal auf Foo
emittiert. Ist das der einzige (oder beste) Weg?
Sie können auch Bar direkt Foo-Signal emittieren: 'emit foo-> huzzah()'. Wenn Sie jedoch Foo als QQuickItem speichern ('foo's Typ ist' QQuickItem * '), können Sie das nicht direkt tun, da der Compiler zu Recht keine Ahnung hat, dass' foo' dieses Signal hat. Speichern Sie es entweder als 'Foo *', oder Sie benötigen einen Downcast ('qobject_cast', wenn' foo' kein 'Foo' ist und Sie das Ergebnis überprüfen müssen,' static_cast' wenn Sie sicher sind ist, aber wieder, wenn Sie sicher sind, warum nicht mit dem richtigen Typ an erster Stelle speichern?) – peppe
Danke, @peppe. Ich bin mir nicht sicher, warum es auch ein generisches 'QQuickItem' ist. Ich habe es ersetzt, um es genauer zu machen, und Ihre Syntax funktioniert perfekt. Darf ich vorschlagen, dass Sie Ihren Kommentar zu einer Antwort machen, so dass ich sie akzeptieren kann (und Ihnen im Verlauf des Prozesses eine Wiederholung geben kann)? – Phrogz