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()
{
}
결과
Q_PROPERTY(type name READ getfunction WRITE setFunction NOTIFY notifySignal)
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씩 커진다
Author And Source
이 문제에 관하여(qml -> cpp 내 변수값 읽기 쓰기 & 함수 호출 (Q_PROPERTY)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@minjung0067/qml-cpp-내-변수값-읽기-쓰기-함수-호출-QPROPERTY저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)