qml -> cpp 내 변수값 읽기 쓰기 & 함수 호출 (Q_PROPERTY)

mission

  • cpp 내에 정의된 특정 변수 값을 qml에서 읽기
  • cpp 내에 정의된 특정 변수 값을 qml에서 값을 변경하기

동작 과정

  • 파란색 네모를 누르면 네모 안 숫자가 1씩 증가하도록 함


알아야 하는 사실

  • qml에서 cpp에 정의된 변수를 직접 접근해서 읽는 것 Xx
  • cpp에 추가적으로 구현한 함수를 호출해 그 함수의 반환값을 통해 읽어옴!
  • qml과 연결될 cpp는 QQuickView class의 상속을 받고
  • Q_PROPERTY 매크로를 정의할 수 있는 클래스는 QObject class를 상속받아야 함

핵심 -> Q_PROPERTY

  • 형식 : Q_PROPERTY(type name READ getfunction WRITE setFunction NOTIFY notifySignal)
  • 구현: Q_PROPERTY(int num READ getnum WRTIE setnum NOTIFY numchanged)
  • 의미

    qml 안에서 text: ~.num 이런 식으로 쓰면 int 형을 반환하는 getnum 이 호출
    그 num 값을 ~.num += 3 이런 식으로 WRITE 하면 setnum 함수 호출
    cpp내에서 numchanged 함수 호출



각 파일 별 역할

  • main.cpp : MainMenu app 실행 및 app.exec() 리턴
  • MainMenu.h : MainMenu() 클래스 선언 및 init(), showqml() 포함
  • MainMenu.cpp : init()와 showqml() 함수 내용 작성되어있음

    init 함수 내에서 MainViewCtrl 객체 만듦

  • MainViewCtrl.h (Q_OBJECT) : Q_PROPERTY 매크로 선언
  • MainViewCtrl.cpp : MainView 객체 생성, setContextProperty 로 cpp 함수와 main.qml 연결

    헤더파일에 정의했던 함수들 getnum, setnum, getViewPtr() 함수 내용 작성

  • MainView.h (QQuickView) : MainView 객체 선언
  • MainView.cpp : MainView 함수 정의


main.cpp

#include "MainMenu.h"

int main(int argc, char *argv[])
{
    MainMenu app(argc, argv);

    return app.exec();
}

MainMenu.h

#ifndef MAINMENU_H
#define MAINMENU_H

#include <QGuiApplication>
#include <QQuickItem>

#include "MainViewCtrl.h"

class MainMenu : public QGuiApplication
{
public:
    MainMenu(int &, char **);

    MainViewCtrl* m_pMainViewCtrl;

    void init();

    void showqml();
};

#endif // MAINMENU_H

MainMenu.cpp

#include "MainMenu.h"

MainMenu::MainMenu(int &argc, char *argv[]) : QGuiApplication(argc, argv)
{
    init();
    showqml();
}

void MainMenu::init()
{
    m_pMainViewCtrl = new MainViewCtrl();
}

void MainMenu::showqml()
{
    m_pMainViewCtrl->getViewPtr()->show();
}

MainViewCtrl.h

#include <QObject>

#include "MainView.h"

class MainViewCtrl : public QObject
{
Q_OBJECT
Q_PROPERTY(int num READ getnum WRITE setnum NOTIFY numchanged)

public:
    MainViewCtrl();
    MainView* getViewPtr();

    int getnum() const;
    void setnum(const int &);

private :
    MainView *m_pMainView;

    int m_NumValue;

signals :
    void numchanged();

};

MainViewCtrl.cpp

#include "MainViewCtrl.h"

#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QDebug>

MainViewCtrl::MainViewCtrl() : QObject(), m_NumValue(0)
{
    m_pMainView = new MainView();

    m_pMainView->engine()->rootContext()->setContextProperty("my", this);
    m_pMainView->setSource(QUrl(QStringLiteral("qrc:/main.qml")));

}

MainView* MainViewCtrl::getViewPtr()
{
    return m_pMainView;
}

int MainViewCtrl::getnum() const
{
    qDebug() << "[1] call getnum func !!";
    return m_NumValue;
}

void MainViewCtrl::setnum(const int &gn)
{
    qDebug() << "[2] call setnum func !!";

    m_NumValue = gn;
    emit numchanged();
}

MainView.h

#ifndef MAINVIEW_H
#define MAINVIEW_H

#include <QQuickView>

class MainView :public QQuickView
{
Q_OBJECT
public:
    MainView();
};

#endif // VIEW_H

MainView.cpp

#include "MainView.h"

MainView::MainView()
{

}

결과

버튼을 누르면 숫자가 1씩 커진다

좋은 웹페이지 즐겨찾기