-
Notifications
You must be signed in to change notification settings - Fork 2
Komunikacija između Cpp i QML komponenti
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).
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 kaoBoolean
. -
isRecording
znači da će se ova promenljiva pojaviti pod nazivomisRecording
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 funkcijaisRecording
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 funkcijasetIsRecording
. -
NOTIFY isRecordingChanged
služi da deklariše da ćemo mi (odn. C++) emitovati signalisRecordingChanged
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 svojstvoisRecording
, 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.
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)
}