2016-07-19 10 views
0

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?

+0

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

+0

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

Antwort

1

Aktualisieren Sie die . Verwenden Sie statt QQuickItem *foo;Foo *foo;.

class Bar: public QObject { 
... 
private: 
    Foo *foo; 
}; 

//and emit the signal 
void Bar::BeforeRender() { 
    emit foo->huzzah(); 
}