2013-02-17 25 views
6

Biegam w kółko o tym. Po prostu nie mogę owinąć głowy sygnałami i gniazdami.kaskady i sygnały/gniazda

Po prostu szukam jakiegoś mechanizmu, który automatycznie aktualizuje mój interfejs, gdy pojawi się sygnał w moim C++.

Przykład:

Mam dwie etykiety w QML które mają tekst: _app.method która zwraca wartość.

Mam przycisk, który onClicked uruchamia metodę Q_INVOKABLE. Ta metoda emituje sygnał po zakończeniu, np. Pobiera geocordinates i aktualizuje wartości, o których mowa w powyższym tekście: przypisania.

Czego chcę, to COŚ, aby zaktualizować tekst: przypisania po zmianie tych wartości.

Po prostu potrzebuję tych sygnałów/gniazd wyjaśnionych w sposób oczywisty. Jedyne przykłady w dokumentacji wydają się przyjmować TYLKO QML lub C++, ale nie mieszankę obu. Przykładowy kod ma przykłady, ale nie jest szczegółowo objaśniony w dokumentacji.

Gdybyś miał prosty opis, na pewno mógłbym się do niego dostosować. Np. 1: zdefiniuj to w QML, 2: zdefiniuj to w pliku hpp, 3: zdefiniuj je w pliku cpp.

Próbowałem używać setPropery QObject ("tekst", "wartość"), ale moja aplikacja ulega awarii podczas próby tego.

Powiadom mnie jeśli się mylę ...

1) w 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) w 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) w KPP:

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); 
} 

Co się dzieje, że w QML, metoda onClick CONNECT S sygnał z funkcją QML; co oznacza, że ​​teraz słuchamy zmiany wartości, a kiedy to nastąpi, ta funkcja zostanie wywołana. THEN, zmieniamy wartość ... ponieważ Q_PROPERTY ustawia wartość zapisu na funkcję o nazwie setValue, setValue jest wywoływana z nową wartością; wewnętrznie, zmienna m_iValue zostaje zmieniona i pojawia się emit, który mówi każdemu, kto nasłuchuje valueChanged, że istnieje nowa wartość.

Hej, mój QML tego słucha! (za pomocą skryptu _app.valueChanged.connect). Tak więc, obiekt QML (Button), który tego słuchał, ma funkcję onValueChanged, która została wywołana, z nową wartością (z powodu wartości emitChanged (m_iValue).

Proszę mi powiedzieć, że to wymyśliłem ?? !?!

Odpowiedz

10

Jeśli używasz makra Q_PROPERTY, nie ma potrzeby wiązania sygnału onValueChanged z funkcją jawnie zmieniającą tekst przycisku, a także nie musisz emitować sygnału valueChanged z m_iValue.Dokonać zmian w wymienionych poniżej odpowiednich plików

QML:

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

HPP:

signals: 
    void valueChanged(); 

CPP:

emitują valueChanged();

+0

Wow ... jakoś działa, dzięki magii SIGNAL/SLOT. Czy są jakieś specjalne słowa kluczowe, które sprawiają, że to działa? –

+0

Nie każdy jestem świadomy –