c++ qt function qml

Acceda a la función C++ desde QML



qt function (2)

Como alternativa a qmlRegisterType () en main.cpp, también puede usar las propiedades de contexto para hacer que las variables de QObject estén disponibles en QML. (En caso de que no necesite crear diferentes instancias de su objeto con QML posterior).

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

En QML, puede acceder al objeto desde cualquier lugar de su código con el nombre especificado en main.cpp. No se requieren declaraciones adicionales:

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

Puede encontrar más información sobre las posibilidades de comunicación QML <-> C ++ aquí: https://v-play.net/cross-platform-development/how-to-expose-a-qt-cpp-class-with-signals-and-slots-to-qml

Estoy tratando de hacer un pequeño programa con Qt. Tengo un main.cpp con el siguiente código:

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

y tengo un archivo .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(); } } }

Ahora, cuando hago clic en MouseArea , el programa se cierra. Lo que quiero es que llame a la función reken_tijden_uit en el archivo main.cpp .

Busqué en Google y busqué en este sitio para. Encontré un par de respuestas, pero no funcionó.

Entonces, ¿qué código debo poner para poder llamar a la función reken_tijden_uit en C ++?

Gracias por adelantado.

El archivo de encabezado se ve así:

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

y el archivo 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() } } }

Y los errores son los siguientes:

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

Entonces, ¿qué hice mal?


Para que se llame cualquier código C ++ desde QML, debe residir dentro de un QObject .

Lo que debes hacer es crear una clase descendiente de QObject con tu función, registrarla en QML, crear instancias en tu QML y llamar a la función. Tenga en cuenta también que debe marcar su función con Q_INVOKABLE .

Código:

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