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
    }
}

실행 결과

좋은 웹페이지 즐겨찾기