2012-02-29 3 views
21

Qt로 약간의 프로그램을 만들려고합니다. 나는 다음과 같은 코드를 사용하여 main.cpp 있습니다QML의 C++ 함수에 액세스

#include <QtGui/QApplication> 
#include "qmlapplicationviewer.h" 

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 

    QmlApplicationViewer viewer; 
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setMainQmlFile(QLatin1String("qml/tw_looptijden_berekenen/main.qml")); 
    viewer.showExpanded(); 

    return app->exec(); 
} 

int reken_tijden_uit(){ 
    return true; 
} 

을하고 난 .qml 파일이 있습니다

import QtQuick 1.1 

Rectangle { 

width: 360 
height: 360 
Text { 
    text: qsTr("Hello World") 
    anchors.centerIn: parent 
} 
MouseArea { 
    anchors.fill: parent 
    onClicked: { 
     Qt.quit(); 
    } 
} 
} 

지금, 나는 MouseArea를 클릭하면 프로그램이 종료합니다. 내가 원하는 것은 main.cpp 파일에서 함수 reken_tijden_uit을 호출한다는 것입니다.

저는 많이 봤는데,이 사이트에서 검색했습니다. 나는 몇 가지 대답을 찾았지만 한 가지를 얻지는 못했습니다.

그래서 어떤 코드를 어디에 넣어야합니까? 그래서 C++에서 reken_tijden_uit 함수를 호출 할 수 있습니까?

미리 감사드립니다.

#ifndef EIGEN_FUNCTION_HEADER_H 
#define EIGEN_FUNCTION_HEADER_H 

class MyObject : public QObject{ 
    Q_OBJECT 
public: 
    explicit MyObject (QObject* parent = 0) : QObject(parent) {} 
    Q_INVOKABLE int reken_tijden_uit(){ 
    return 1; 
    } 
}; 

#endif // EIGEN_FUNCTION_HEADER_H 

main.cpp :

#include <QtGui/QApplication> 
#include "qmlapplicationviewer.h" 
#include "eigen_function_header.h" 

QScopedPointer<QApplication> app(createApplication(argc, argv)); 

qmlRegisterType<MyObject>("com.myself", 1, 0, "MyObject"); 

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 

    QmlApplicationViewer viewer; 
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setMainQmlFile(QLatin1String("qml/tw_looptijden_berekenen/main.qml")); 
    viewer.showExpanded(); 

    return app->exec(); 
} 

을하고 QML 파일 :


헤더 파일은 다음과 같다

import QtQuick 1.1 
import com.myself 1.0 

Rectangle { 
    width: 360 
    height: 360 
    Text { 
     text: qsTr("Hello World") 
     anchors.centerIn: parent 
    } 
    MyObject { 
     id: myobject 
    } 
    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      myobject.reken_tijden_uit() 
     } 
    } 
} 

그리고 오류는 다음과 같습니다 :

D:\*\main.cpp:6: error: 'argc' was not declared in this scope 
D:\*\main.cpp:6: error: 'argv' was not declared in this scope 
D:\*\main.cpp:8: error: expected constructor, destructor, or type conversion before '<' token 

그래서 내가 뭘 잘못 했습니까?

+0

다음 스레드를 확인하시기 바랍니다이 당신에게 HTTP 도움이 될 : // stackoverflow.com/questions/5709820/communication-between-c-and-qml – shofee

+0

안녕하세요, 내가 그것을 확인하지만, 정확히 내가 원하는 건 아니에요 ... 나는 cpp 함수를 호출하는 mousearea에 onclick 이벤트를 추가하고 싶습니다. (자바 스크립트에서 그냥 reken_tijden_uit(), 어떻게 C++ 및 qml 작동합니까 ... – Mathlight

답변

33

QML에서 호출 할 C++ 코드는 QObject 내에 있어야합니다.

함수를 사용하여 QObject 하위 클래스를 만들고 QML에 등록한 다음 QML에 인스턴스화하고 함수를 호출하면됩니다. 또한 함수에 Q_INVOKABLE을 표시해야합니다.

코드 :

#ifndef EIGEN_FUNCTION_HEADER_H 
#define EIGEN_FUNCTION_HEADER_H 

#include <QObject> 

class MyObject : public QObject{ 
    Q_OBJECT 
public: 
    explicit MyObject (QObject* parent = 0) : QObject(parent) {} 
    Q_INVOKABLE int reken_tijden_uit(){ 
    return 1; 
    } 
}; 

#endif // EIGEN_FUNCTION_HEADER_H 

MAIN.CPP :

#include <QtGui/QApplication> 
#include <QtDeclarative> 

#include "qmlapplicationviewer.h" 
#include "eigen_function_header.h" 

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 
    qmlRegisterType<MyObject>("com.myself", 1, 0, "MyObject"); 

    QmlApplicationViewer viewer; 
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setMainQmlFile(QLatin1String("qml/tw_looptijden_berekenen/main.qml")); 
    viewer.showExpanded(); 

    return app->exec(); 
} 

QML : 대안으로

import QtQuick 1.1 
import com.myself 1.0 

Rectangle { 

    width: 360 
    height: 360 
    Text { 
     text: qsTr("Hello World") 
     anchors.centerIn: parent 
    } 
    MyObject { 
     id: myobject 
    } 

    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      console.log(myobject.reken_tijden_uit()) 
     } 
    } 
} 
+0

및 코드의 첫 번째 부분을 넣을 필요가 ??? – Mathlight

+0

별도의 .cpp/.h 추가 베스트 귀하의 프로젝트에 .qmlRegisterType을 수행하기 전에 .h를 main.cpp에 포함하는 것을 잊지 마십시오. – Koying

+0

괜찮습니다. 몇 가지 오류가 있습니다. 그래서 새로운 대답을 게시 할 것입니다. 문제가 무엇인지 분명합니다. – Mathlight

0

에 qmlRegisterType() MAIN.CPP에서, 당신을 컨텍스트 속성을 사용하여 QO를 만들 수도 있습니다. QML에서 사용할 수있는 변수를 지정하십시오. (나중에 QML로 개체의 다른 인스턴스를 만들 필요가없는 경우).

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 

    QmlApplicationViewer viewer; 
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setMainQmlFile(QLatin1String("qml/tw_looptijden_berekenen/main.qml")); 
    viewer.showExpanded(); 

    // add single instance of your object to the QML context as a property 
    // the object will be available in QML with name "myObject" 
    MyObject* myObject = new MyObject(); 
    viewer.engine()->rootContext()->setContextProperty("myObject", myObject); 

    return app->exec(); 
} 

QML에서는 코드에서 main.cpp에 지정된 이름으로 개체를 액세스 할 수 있습니다.추가 선언이 필요하지 않습니다 :

MouseArea { 
    anchors.fill: parent 
    onClicked: { 
     myObject.reken_tijden_uit() 
    } 
} 

당신은 < QML에 대한 자세한 정보를 찾을 수 있습니다 - 여기> C++ 통신 가능성 : https://v-play.net/cross-platform-development/how-to-expose-a-qt-cpp-class-with-signals-and-slots-to-qml

관련 문제