c++ क्यूएमएल से सी++ फ़ंक्शन एक्सेस करें




qt function (2)

Main.cpp में qmlRegisterType () के विकल्प के रूप में, आप QML में QObject चर उपलब्ध कराने के लिए संदर्भ गुणों का भी उपयोग कर सकते हैं। (यदि आपको बाद में क्यूएमएल के साथ अपने ऑब्जेक्ट के विभिन्न उदाहरण बनाने की आवश्यकता नहीं है)।

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();
}

क्यूएमएल में, फिर आप अपने कोड में किसी भी स्थान से ऑब्जेक्ट को मुख्य.cpp में निर्दिष्ट दिए गए नाम से एक्सेस कर सकते हैं। कोई अतिरिक्त घोषणा की आवश्यकता नहीं है:

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

आप क्यूएमएल <-> सी ++ संचार संभावनाओं पर यहां अधिक जानकारी प्राप्त कर सकते हैं: https://v-play.net/cross-platform-development/how-to-expose-a-qt-cpp-class-with-signals-and-slots-to-qml

मैं क्यूटी के साथ एक छोटा सा कार्यक्रम बनाने की कोशिश कर रहा हूं। मेरे पास निम्न कोड के साथ एक main.cpp :

#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 पर क्लिक करता MouseArea , तो प्रोग्राम छोड़ देता है। मैं क्या चाहता हूं कि यह reken_tijden_uit फ़ाइल में फ़ंक्शन reken_tijden_uit को कॉल करता है।

मैंने बहुत गुमराह किया है, और इस साइट पर खोज की है। मुझे कुछ जवाब मिल गए हैं, लेकिन मुझे एक काम नहीं मिला।

तो मैं कौन सा कोड 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();
}

और क्यूएमएल फ़ाइल:

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

तो मैंने क्या गलत किया?


QML से किसी भी C ++ कोड को कॉल करने के लिए, इसे QObject अंदर अवश्य होना चाहिए।

आपको जो करना है वह आपके फ़ंक्शन के साथ एक QObject descended क्लास बनाएं, इसे QML पर पंजीकृत करें, इसे अपने क्यूएमएल में तुरंत चालू करें और फ़ंक्शन को कॉल करें। ध्यान दें कि आपको अपने फ़ंक्शन को Q_INVOKABLE साथ 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())
        }
    }
}




qml