mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef MYQMLTYPE_H
#define MYQMLTYPE_H

#include <QObject>

class MyQMLType : public QObject
{
 Q_OBJECT
 Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged) // this makes message available as a QML property

public:
 MyQMLType();

public slots: // slots are public methods available in QML
 int increment(int value);

signals:
 void messageChanged();

public:
 QString message() const;
 void setMessage(const QString& value);

private:
 QString m_message;

};

#endif // MYQMLTYPE_H

C++ Datei:
#include "myqmltype.h"

MyQMLType::MyQMLType() : m_message("")
{

}

int MyQMLType::increment(int value) {
 return value + 1;
}

QString MyQMLType::message() const {
 return m_message;
}

void MyQMLType::setMessage(const QString& value) {
 if(m_message != value) {
   m_message = value;
   messageChanged(); // trigger signal of property change
 }
}

main.cpp Datei:
int main(int argc, char *argv[])
{
 // ...

 // register a QML type made with C++
 qmlRegisterType<MyQMLType>("com.yourcompany.xyz", 1, 0, "MyQMLType"); // MyQMLType will be usable with: import com.yourcompany.xyz 1.0

 engine.load(QUrl(vplay.mainQmlFileName()));
 return app.exec();
}

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.
int main(int argc, char *argv[])
{
 // ...

 // register a QML type made with C++
 qmlRegisterType<MyQMLType>("com.yourcompany.xyz", 1, 0, "MyQMLType"); // MyQMLType will be usable with: import com.yourcompany.xyz 1.0

MySuperClass mysuperclass;

connect ??

 engine.load(QUrl(vplay.mainQmlFileName()));
 return app.exec();
}

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver S. (oliverso)
Datum:

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

Oliver

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowie in diesem Beispiel?

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

....

Ist es dann die gleiche Instanz?

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.