Qt - gewusst Wie: ausführen eines C++ - Funktion, wenn QML-button geklickt? Mit QQmlApplicationEngine
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QDebug>
#include <QObject>
class MyClass : public QObject
{
public:
MyClass();
public slots:
void buttonClicked();
void buttonClicked(QString &in);
};
#endif //MYCLASS_H
myclass.cpp
#include "myclass.h"
MyClass::MyClass()
{
}
void MyClass::buttonClicked()
{
//Do Something
}
void MyClass::buttonClicked(QString &in)
{
qDebug() << in;
}
main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include <myclass.h>
#include <QQmlContext>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
MyClass myClass; //A class containing my functions
//Trying to "SetContextProperty" as I saw people do it to achieve C++/QML connection
QQmlContext * context = new QQmlContext(engine.rootContext());
context->setContextProperty("_myClass", &myClass);
return app.exec();
}
Ich möchte eine Funktion in myClass Klasse, die einen QString parameter, wenn eine QML-Schaltfläche geklickt wird ..
Wenn ich kompilieren & laufen .. es geht alles reibungslos.
Aber wenn ich auf den Knopf .. es zeigt diese Fehlermeldung in den debugger:
qrc:///main.qml:80: ReferenceError: _myClass ist nicht definiert
~> "Zeile 80 in meinem QML-Datei":
74: MouseArea {
75: id: mouseArea1
76: anchors.fill: parent
77: hoverEnabled: true;
78: onEntered: { rectangle1.border.width = 2 }
79: onExited: { rectangle1.border.width = 1 }
80: onClicked: _myClass.buttonClicked("Worked?")
81: }
EDIT: ( Wie für die Fehler, die das kompilieren Fehler )
Als @Jairo vorgeschlagen, alle Klassen müssen erbt von QObject.
Immer noch auf der Suche nach einer Lösung für mein Hauptproblem.
- Was sind die Fehler, die es gibt?
- Sorry budd, ich habe es bearbeitet die Frage, & Hinzugefügt; alle notwendigen Informationen.
- Komm... du auch nicht erwähnt, welche Zeile gibt den Fehler, noch haben Sie Ihre Klasse... Der Fehler muss aus Ihrer Klasse.
- Ist MyClass basierend auf der QObject-Klasse?
- Yup, das ist es! myclass erbt von QObject. Aber auch das löst nicht das Hauptproblem, leider .. Wie kann ich den code ändern um es möglich zu machen verwenden Sie eine C++ - Funktion (
myClass.buttonClicked(QString)
) von QML wie: [_myClass.buttonClicked("JJJ")
]? Vielen Dank 🙂 - Ich will, dass jemand mir hilft, die Migration von
QQmlApplicationEngine
zuQDeclarativeView
oderQtQuickView
, das Hauptziel zu erreichen ( mit Hilfe eines C++ - Funktion, wenn ein QML-button angeklickt wird ). 🙂 - Oh sorry, ich schrieb die Frage mit (myClass) - alias, um es einfacher für andere Menschen zu geben, die eine verallgemeinerte Lösung. Bearbeitet
- Kein problem. Allerdings ist die Frage noch fehlt, welche Fehler Sie bekommen. Da gibt es keine Antworten für deinen aktuellen code, damit ungültig, könnte man genauso gut den code aktualisieren, um die neueste version (mit
Q_OBJECT
etc), erklären, was ist falsch mit ihm (zB. welche genaue Fehlermeldung, die Sie bekommen). - Alles ist geschrieben in der die Frage ist nun :]
- Eigentlich nicht,
_
ist okay, wie ich gesehen habe, eine Menge Leute nutzen es. Aber um sicher zu sein, habe ich entfernt, es & probiert .. funktioniert Nicht, gleiche Fehlermeldung myClass ist nicht definiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Uh oh. Es gibt mehrere Dinge, die hier falsch. (Hat die den code selbst kompilieren?)
Ersten Dinge zuerst. Bei der übergabe etwas zu der QML-engine root-Eigenschaft, Sie können nicht erstellen Sie einen neuen Kontext -- benutzen Sie den root-Kontext direkt, etwa so:
Nächsten, der definition der Klasse, hat einige Probleme. Siehe meine Kommentare im code unter:
Konstruktor die Umsetzung passieren soll, die übergeordnete Basisklasse:
void buttonClicked();
machen, damit es funktioniert, ich denke QML nicht erkennen diese Art der Funktion deklarieren. Ich danke Ihnen so sehr.