Skip to content

Komunikacija između Cpp i QML komponenti

Aleksandar Stefanović edited this page Dec 22, 2019 · 1 revision

Umetanje C++ promenljiva u QML

Da bi učinili neku C++ promenljivu dostupnu u okviru QML koda, radimo sledeće:

MainModel mainModel;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("mainModel", &mainModel);

Ovime, promenljiva mainModel iz C++-a postaje dostupna u QML-u pod nazivom mainModel (ova imena ne moraju da se međusobno poklapaju).

Otkrivanje svojstava C++ objekta QML-u

Da bi neko svojstvo (eng. property) C++ objekta bilo vidiljvo u okviru QML-a, potrebno ga je deklarisati Q_PROPERTY makroom:

class MainModel : public QObject {

    Q_OBJECT
    Q_PROPERTY(bool isRecording READ isRecording WRITE setIsRecording NOTIFY isRecordingChanged)

public:
    bool isRecording() {
        return _isRecording;
    }

    void setIsRecording(bool isRecording) {
        _isRecording = isRecording;
        emit isRecordingChanged();
    }

signals:
    void isRecordingChanged();

private:
    bool _isRecording;
}

Imamo C++ svojstvo _isRecording koje ima svoj geter i svoj seter. Koristimo Q_PROPERTY makro sa:

Q_PROPERTY(bool isRecording READ isRecording WRITE setIsRecording NOTIFY isRecordingChanged)
  • bool znači da će se u QML-u ova promenljiva pojaviti kao Boolean.

  • isRecording znači da će se ova promenljiva pojaviti pod nazivom isRecording u QML-u.

  • READ isRecording znači da, kada se u QML-u ovo polje čita (odn. ponaša se kao r-value), izvršiće se funkcija isRecording kako bi se dobila njena vrednost.

  • WRITE setIsRecording znači da, kada se u QML u ovo polje upisuje (odn. ponaša se kao l-value), tada će biti pozvana funkcija setIsRecording.

  • NOTIFY isRecordingChanged služi da deklariše da ćemo mi (odn. C++) emitovati signal isRecordingChanged svaki put kada se ova promenljiva promeni. Ovo je jako bitno, jer ovima QML zna da ponovo iscrta delove grafičkog korisničkog interfejsa u kojima se spominje svojstvo isRecording, kada se to svojstvo promeni. Da ovo nije deklarisano, promenljiva bi se menjala na nivou C++-a, ali QML ne bi reagovao na te promene, jer nije svestan toga da se ta promenljiva menja.

Pozivanje funkcija C++ objekata kroz QML

Da bi se ovo ostvarilo, potrebno je da se funkcija C++-a smesti u public slots odeljak, i tada se normalno može pozivati kroz QML:

class MainModel : public QObject {
    Q_OBJECT

    ...

public slots:
    void playNote(float frequency);

    ...
}
Button {
    ...
    onPressed: mainModel.playNote(263.22)
}