qml -> cpp 함수 호출 (qmlRegisterType)
mission
- 버튼을 누르면 화면 내의 숫자가 1씩 증가하도록 함
알아야하는 사실
매우 중요클래스 이름 무조건대문자로!!!!!!!!!!!!!!!!!!!!!!!이거 때문에 내가 .... 후- qml 내에서 직접 호출하는 함수는 class에 선언된 그냥 일반적인 함수가 아니라
- qml에서 직접 접근할 수 있도록
따로 구현된함수를 호출하는 것임 - 그러면 일단 함수를
따로 구현해야겠지?!
결론
- view.h 헤더파일에 Q_INVOKABLE 로 함수 정의내림
- view.cpp 에서 함수 내용 작성
- menu.cpp에 qmlRegisterType으로 등록
- main.qml에서 import hello 1.0이런 식으로 import 하면
- main.qml 내부에서 view.cpp의 작성한 testfunc 호출 가능
main.cpp
#include "Menu.h"
int main(int argc, char *argv[])
{
Menu app(argc, argv);
return app.exec();
}
Menu.h
#include <QGuiApplication>
#include <QQuickItem>
#include "View.h"
class Menu : public QGuiApplication
{
public:
Menu(int &, char **);
void init();
void showqml();
View *m_pQuickView;
};
Menu.cpp
qmlRegisterType으로 qml에서 쓸 수 있도록 등록
qmlRegisterType<클래스 명>("사용할접근주소", 큰버전, 작은버전, "QML에서 쓸 이름");
QML에서 쓸 이름을 무조건 대문자로 해야함.
소문자로 할 시 qml에서 생성자가 아닌 property로 인식을 해버림.
#include "Menu.h"
Menu::Menu(int &argc, char *argv[]) : QGuiApplication(argc, argv)
{
init();
showqml();
}
void Menu::init()
{
qmlRegisterType<View>("View", 1, 0, "View");
m_pQuickView = new View();
m_pQuickView->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
}
void Menu::showqml()
{
m_pQuickView->show();
}
View.h
함수를 따로 구현한다는 것 정의 부분이 포함되어있는 파일.
Q_INVOKABLE 매크로를 붙여 선언해주면 해당 함수에 접근이 가능하다.
#include <QQuickView>
#include <QObject>
class View: public QQuickView
{
Q_OBJECT
public:
View();
Q_INVOKABLE void testfunc(int);
// 따로 구현할 함수 일단 정의부터 내림
// Q_INVOKABLE 매크로를 붙여 멤버 함수를 선언해주면 qml에서 해당 함수에 접근 가능
};
View.cpp
함수를 눌렀을 시 결과 출력하는 부분
#include <QDebug>
#include "View.h"
View::View()
{
}
void View::testfunc(int getnum)
{
qDebug() << "call hello func!!!!!!!!!!!" << getnum;
}
main.qml
import QtQuick 2.6
import View 1.0
Item{
property int num: 1
width: 200
height: 200
// property 생성 -> mainview.testfunc 이런식으로 cpp에서 따로 구현된 함수 호출 가능
Rectangle {
width: 100
height: 100
color: "gray"
MouseArea{
anchors.fill: parent
onClicked:{
mainview.testfunc(num)
// 함수 호출 !
num += 1
// 클릭할 때마다 숫자 + 1
}
}
}
View{
id: mainview
}
Text{
id: mytext
x: 100
text: num
}
}
실행 결과
#include "Menu.h"
int main(int argc, char *argv[])
{
Menu app(argc, argv);
return app.exec();
}
#include <QGuiApplication>
#include <QQuickItem>
#include "View.h"
class Menu : public QGuiApplication
{
public:
Menu(int &, char **);
void init();
void showqml();
View *m_pQuickView;
};
qmlRegisterType으로 qml에서 쓸 수 있도록 등록
qmlRegisterType<클래스 명>("사용할접근주소", 큰버전, 작은버전, "QML에서 쓸 이름");
QML에서 쓸 이름을 무조건 대문자로 해야함.
소문자로 할 시 qml에서 생성자가 아닌 property로 인식을 해버림.
#include "Menu.h"
Menu::Menu(int &argc, char *argv[]) : QGuiApplication(argc, argv)
{
init();
showqml();
}
void Menu::init()
{
qmlRegisterType<View>("View", 1, 0, "View");
m_pQuickView = new View();
m_pQuickView->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
}
void Menu::showqml()
{
m_pQuickView->show();
}함수를 따로 구현한다는 것 정의 부분이 포함되어있는 파일.
Q_INVOKABLE 매크로를 붙여 선언해주면 해당 함수에 접근이 가능하다.
#include <QQuickView>
#include <QObject>
class View: public QQuickView
{
Q_OBJECT
public:
View();
Q_INVOKABLE void testfunc(int);
// 따로 구현할 함수 일단 정의부터 내림
// Q_INVOKABLE 매크로를 붙여 멤버 함수를 선언해주면 qml에서 해당 함수에 접근 가능
};
함수를 눌렀을 시 결과 출력하는 부분
#include <QDebug>
#include "View.h"
View::View()
{
}
void View::testfunc(int getnum)
{
qDebug() << "call hello func!!!!!!!!!!!" << getnum;
}
import QtQuick 2.6
import View 1.0
Item{
property int num: 1
width: 200
height: 200
// property 생성 -> mainview.testfunc 이런식으로 cpp에서 따로 구현된 함수 호출 가능
Rectangle {
width: 100
height: 100
color: "gray"
MouseArea{
anchors.fill: parent
onClicked:{
mainview.testfunc(num)
// 함수 호출 !
num += 1
// 클릭할 때마다 숫자 + 1
}
}
}
View{
id: mainview
}
Text{
id: mytext
x: 100
text: num
}
}

Author And Source
이 문제에 관하여(qml -> cpp 함수 호출 (qmlRegisterType)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@minjung0067/qml-cpp-함수-호출-qmlRegisterType저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)