//나쁜예: 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() }