qmlRegisterType connect zu anderem C++ Objekt

Gast #5894031
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
}
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
Gast
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?
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.