2013-02-17 19 views
6

Ich laufe im Kreis darüber. Ich kann meinen Kopf nicht um Signale und Schlitze wickeln.Kaskaden und Signale/Schlitze

Nur auf der Suche nach einem Mechanismus, der automatisch meine UI aktualisieren kann, wenn ein Signal in meinem C++ auftritt.

Beispiel:

Ich habe zwei Etiketten in QML, die Text haben: _app.method, die einen Wert zurückgibt.

Ich habe eine Schaltfläche, die OnClicked eine Q_INVOKABLE-Methode ausführt. Diese Methode gibt ein Signal aus, wenn sie fertig ist, z. B. holt sie Geocordinaten und aktualisiert die Werte, auf die sich der obige Text: Zuweisungen stützt.

Was ich möchte, ist etwas zu aktualisieren, den Text: Zuordnungen, sobald diese Werte ändern.

Ich brauche nur diese Signale/Slots erklärt einfach. Die einzigen Beispiele in der Dokumentation scheinen NUR QML oder C++ anzunehmen, aber keine Mischung aus beidem. Der Beispielcode enthält Beispiele, die jedoch nicht speziell in der Dokumentation erläutert werden.

Wenn Sie eine einfache Beschreibung hatten, ich bin sicher, dass ich mich daran anpassen könnte. ZB 1: Definieren Sie dies in QML, 2: Definieren Sie dies in der hpp-Datei, 3: Definieren Sie diese in der cpp-Datei.

Ich habe versucht mit QObject setPropery ("Text", "Wert"), aber meine App stürzt ab, wenn dies versucht.

Sag mir, wenn ich falsch bin ...

1) in QML:

Button { 
    id: aButton 
    text: _app.value 
    onClicked: { 
     _app.valueChanged.connect(aButton.onValueChanged); 
     _app.value = _app.value + 1; 
    } 
    function onValueChanged (val) { 
     aButton.text = "New value: " + val; 
    } 
} 

2) in HPP:

Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged) 
public: 
    int value(); 
    void setValue(int i); 
signals: 
    void valueChanged(int); 
private: 
    int m_iValue; 

3) in CPP:

int class::value() 
{ 
    return m_iValue; 
} 

void class::setValue(int i) 
{ 
// name is same as HPP WRITE Q_PROPERTY statement 
    m_iValue = i; 
    emit valueChanged(m_iValue); 
} 

Also, was passiert, ist, dass in QML die onClick Methode CONNECT S das Signal mit einer QML-Funktion; Das heißt, jetzt hören wir auf eine Wertänderung, und wenn dies der Fall ist, wird diese Funktion aufgerufen. DANN ändern wir den Wert ... da der Q_PROPERTY den Schreibwert auf eine Funktion namens setValue setzt, wird setValue mit dem neuen Wert aufgerufen; intern wird m_iValue geändert, und es erfolgt eine Emittierung, die angibt, wer auf valueChanged gehört, dass ein neuer Wert vorhanden ist.

Hey, mein QML hört mir das zu! (über das Skript _app.valueChanged.connect). Also, das QML-Objekt (der Button), das das hörte, hat seine onValueChanged-Funktion aufgerufen, mit dem neuen Wert (wegen des emit valueChanged (m_iValue).

Bitte sagen Sie mir, dass ich das herausgefunden habe ?? !?!

Antwort

10

Wenn Sie das Makro Q_PROPERTY verwenden, müssen Sie das Signal onValueChanged nicht explizit mit einer Funktion verknüpfen, um den Text der Schaltfläche zu ändern, und Sie müssen auch kein valueChanged-Signal mit m_iValue ausgeben.Machen Sie weiter unten genannten Änderungen in entsprechenden Dateien

QML:

Button { 
    horizontalAlignment: HorizontalAlignment.Center 
    verticalAlignment: VerticalAlignment.Center 
    id: aButton 
    text: _app.value 
    onClicked: { 
     _app.value = _app.value + 1 
    } 
} 

HPP:

signals: 
    void valueChanged(); 

CPP:

emittieren valuechanged();

+0

Wow ... das funktioniert irgendwie, dank der SIGNAL/SLOT Magie. Gibt es spezielle Keywords im Spiel, die das funktionieren lassen? –

+0

Nicht ich bin mir dessen bewusst –