//나쁜예: C++ 내에서 QML 객체 수정
QObject *artistLabel = rootItem->findChildren("artistLabel");
artistLabel->setProperty("text", m_currentSong->artist);
...
QObject *nextButton = rootItem->findChildren("nextButton");
connect(nextButton, SIGNAL(clicked()), this, &MusicPlayer::nextSong);
QObject *musicPlayer = nextButton->parent();
QMetaObject::invokeMethod(musicPlayer, "startAnimation", Q_ARG(QVariant, duration));
//좋은예: QML의 C++ 객체 사용
//QML은 UI계층으로만 구현해야 한다. 이해하기 쉽다.
Text {
text: musicPlayer.currentSong.artist
}
Button {
onClicked: musicPlayer.nextSong()
}
Slider {
value: musicPlayer.volume
}
//나쁜예: QML 프로퍼티에 상태 저장
class MusicPlayer : public QObject {
Q_INVOKABLE void setVolume(int volume) {
m_backend->setVolume(volume);
}
}
property int volume: 50
Slider {
value: volume
onRightPressed: {
volume = Math.min(100, volume + 5);
musicPlayer.setVolume(volume);
}
}
//좋은예: C++ 프로퍼티에 상태 저장
//더빠르고 유지보수가 용이하다.
class MusicPlayer : public QObject {
Q_PROPERTY(int volume READ volume NOTIFY ...)
public:
int volume() const { return m_volume; }
Q_INVOKABLE void increaseVolume() {
m_volume = qMin(100, volume + 5);
m_backend->setVolume(m_volume);
}
private:
int m_volume = EAR_BLEEDING_LOUD;
}
Slider {
value: musicPlayer.volume
onRightPressed: musicPlayer.increaseVolume()
}