Forum: PC-Programmierung qmlRegisterType connect zu anderem C++ Objekt


von Torben (Gast)


Lesenswert?

Hallo, ich würde gerne die erzeugte MyQMLType mit einer weiteren C++ 
Instanz verbinden, welche in der main.cpp erstellt wurde, die C++ 
Instanz benötigt keine GUI.

Anhand der Beschreibung 
(https://felgo.com/cross-platform-development/how-to-expose-a-qt-cpp-class-with-signals-and-slots-to-qml) 
konnte ich erfolgreich die neue QMLType benutzen und die Signals, Slots 
und Q_PROPERTY klappen wunderbar.

h Datei:
1
#ifndef MYQMLTYPE_H
2
#define MYQMLTYPE_H
3
4
#include <QObject>
5
6
class MyQMLType : public QObject
7
{
8
 Q_OBJECT
9
 Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged) // this makes message available as a QML property
10
11
public:
12
 MyQMLType();
13
14
public slots: // slots are public methods available in QML
15
 int increment(int value);
16
17
signals:
18
 void messageChanged();
19
20
public:
21
 QString message() const;
22
 void setMessage(const QString& value);
23
24
private:
25
 QString m_message;
26
27
};
28
29
#endif // MYQMLTYPE_H

C++ Datei:
1
#include "myqmltype.h"
2
3
MyQMLType::MyQMLType() : m_message("")
4
{
5
6
}
7
8
int MyQMLType::increment(int value) {
9
 return value + 1;
10
}
11
12
QString MyQMLType::message() const {
13
 return m_message;
14
}
15
16
void MyQMLType::setMessage(const QString& value) {
17
 if(m_message != value) {
18
   m_message = value;
19
   messageChanged(); // trigger signal of property change
20
 }
21
}

main.cpp Datei:
1
int main(int argc, char *argv[])
2
{
3
 // ...
4
5
 // register a QML type made with C++
6
 qmlRegisterType<MyQMLType>("com.yourcompany.xyz", 1, 0, "MyQMLType"); // MyQMLType will be usable with: import com.yourcompany.xyz 1.0
7
8
 engine.load(QUrl(vplay.mainQmlFileName()));
9
 return app.exec();
10
}

Wie verbinde ich jetzt die MyQMLType mit einer weiteren reinen C++ 
Objektinstanz (mysuperclass)? Eventuell ist mein Verständnis falsch, 
aber nach meiner Auffassung kann ich mehrere Objekte über Signal & Slots 
verbinden.
1
int main(int argc, char *argv[])
2
{
3
 // ...
4
5
 // register a QML type made with C++
6
 qmlRegisterType<MyQMLType>("com.yourcompany.xyz", 1, 0, "MyQMLType"); // MyQMLType will be usable with: import com.yourcompany.xyz 1.0
7
8
MySuperClass mysuperclass;
9
10
connect ??
11
12
 engine.load(QUrl(vplay.mainQmlFileName()));
13
 return app.exec();
14
}

von Oliver S. (oliverso)


Lesenswert?

Torben schrieb:
> Eventuell ist mein Verständnis falsch, aber nach meiner Auffassung kann
> ich mehrere Objekte über Signal & Slots verbinden.

Dein Verständnis ist richtig, wenn du mit Objekten "QObjects" meinst. 
Wenn also dein MySuperClass ein QObject ist, kannst du dessen Signale 
und Slotls mit denen deines MyQMLType per connect verbinden. Wenn nicht 
(worauf "reine C++ Objektinstanz" schliessen lässt), dann nicht direkt.

https://stackoverflow.com/questions/26937517/qt-connect-without-qobject-or-slots


Oliver

: Bearbeitet durch User
von Torben (Gast)


Lesenswert?

Aber es fehlt doch die Instanz von MyQMLType oder nicht, weil die 
Instanz wird doch erst erstellt, wenn die entsprechende QML geladen wird 
und ich die Qml Type mittels import instanziere, oder?

von Oliver S. (oliverso)


Lesenswert?

Ja, ohne Instanz geht in C++ prinzipiell gar nichts. Also leg halt eine 
an.

Oliver

von Torben (Gast)


Lesenswert?

Sowie in diesem Beispiel?

https://doc.qt.io/qt-5/qtqml-referenceexamples-valuesource-main-cpp.html
1
....
2
 qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty");
3
 BirthdayParty *party = qobject_cast<BirthdayParty *>(component.create());
4
5
....

Ist es dann die gleiche Instanz?

von Rolf M. (rmagnus)


Lesenswert?

Torben schrieb:
> Wie verbinde ich jetzt die MyQMLType mit einer weiteren reinen C++
> Objektinstanz (mysuperclass)? Eventuell ist mein Verständnis falsch,
> aber nach meiner Auffassung kann ich mehrere Objekte über Signal & Slots
> verbinden.

Du könntest es z.B. im Konstruktor von MyQMLType machen.

von Oliver S. (oliverso)


Lesenswert?

Torben schrieb:
> Ist es dann die gleiche Instanz?

Was meinst du mit „gleiche“?

Ich würde mal sagen, das ist genau eine.
Das eigentlich gute an Qt ist, daß die Dokumentation sehr vollständig 
ist...


Oliver

von Torben (Gast)


Lesenswert?

Hat etwas gedauert die Teile zulernen und festgestellt, dass mein Ansatz 
keine gute Lösung war und durch Änderung der Architektur eine bessere 
Lösung erzielen können. Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.