Anfänger sucht Anleitungen für C++/QT
-
@john-0 sagte in Anfänger sucht Anleitungen für C++/QT:
Gtkmm (Gtk C++ Binding) verwendet deutlich neueres C++11
Inwiefern? Wenn ich in die Doku schaue, sieht das Qt sehr ähnlich. Als Unterschied fällt mir nur die Verwendung von Gtkmm eigenen Smartpointern auf.
-
gtkmm kommt hoffentlich ohne einem Meta-Object Compiler aus?
-
@Swordfish sagte in Anfänger sucht Anleitungen für C++/QT:
gtkmm kommt hoffentlich ohne einem Meta-Object Compiler aus?
Ja!
@manni66 sagte in Anfänger sucht Anleitungen für C++/QT:
Inwiefern? Wenn ich in die Doku schaue, sieht das Qt sehr ähnlich. Als Unterschied fällt mir nur die Verwendung von Gtkmm eigenen Smartpointern auf.
Das ist notwendig, weil die zugrundeliegende Glib ein Reference Couting mit C API macht. Die C++ Klasse abstrahiert das ganze so, dass man zwar eine eigene Smartpointerklasse in Gtkmm
Glib::RefPtr
nutzen muss, aber sie verhält sich so wie man das von einer Smartpointerklasse erwartet.
-
@john-0 aber wo ist das neuere C++11?
-
Schau Dir einfach mal Die Doku an z.B. AboutDialog es wird konsequent noexcept, override, delete, … genutzt, und nicht mehr so Dinge wie throw() oder Kopierkonstruktoren als private deklariert und dann nicht implementiert, was der Stand bei C++1998 war.
-
@john-0 das ist in Qt nicht anders.
-
@john-0 sagte in Anfänger sucht Anleitungen für C++/QT:
Schau Dir einfach mal Die Doku an z.B. AboutDialog es wird konsequent noexcept, override, delete, … genutzt, und nicht mehr so Dinge wie throw() oder Kopierkonstruktoren als private deklariert und dann nicht implementiert, was der Stand bei C++1998 war.
So wie das aussieht, spart es mir sogar ein paar Zeilen Code,- gegenüber dem 30 Jahre alten C
-
@Swordfish sagte in Anfänger sucht Anleitungen für C++/QT:
gtkmm kommt hoffentlich ohne einem Meta-Object Compiler aus?
Was ist dein Problem mit dem Meta-Object Compiler?
Das ding ist ein code generator. Der die definition des Meta-Objects für ein von QObject abgeleitete Klasse erstellt.
Und diese Definition ist normales C++.Oft wird das ablehnen des moc begründet wie das signal/slot konzept in Qt funktioniert.
Was zu Zeiten vor Qt5 auch eine berechtigte Kritik war.Für signals/slot war in Qt4 der moc bzw. das Meta-Object essentiell, da hier der Aufruf eines signals über das Meta-Object lief.
Und auch das Verbinden eines signals mit einem slot lief darüber (via strings für den namen des signals und den namen des slots).
Das hatte den Nachteil, dass man erst zur Laufzeit herausfand ob die slot funktion die korrekte parameter definition hat wie das signal, bzw. ob das angegebene signal im entsprechenden Objekt überhaupt existiert.In Qt5 ist das aber nicht mehr der Fall dass man für das Verbinden eines Signals mit einer "Slot" Funktion das Meta-Objekt unbedingt benötigt.
Mit Qt5 kam Unterstützung für std::function like binding von (Member) funktionen und Lambdas.
https://wiki.qt.io/New_Signal_Slot_SyntaxDadurch kann man nun auch Methoden von Klassen, welche nicht von QObject ableiten, an ein Qt signal binden.
Aber das Meta-Object System in Qt ist mehr als nur eine generische Implementierung eines signal/slot systems.
Es bietet unter anderem Introspection.
Bei Gtk+ wird für die introspection auch ein separates tool benötigt. Und man muss Teile der Definitionen duplizieren, da das system die informationen über annotations innerhalb eines Kommentars ausliest:
https://gi.readthedocs.io/en/latest/annotations/giannotations.html#examples/** * gtk_link_button_new_with_label: * @uri: A URI * @label: (nullable): A piece of text or NULL */ GtkWidget * gtk_link_button_new_with_label (const gchar *uri, const gchar *label);
Um jetzt eine Methode einer Klasse (abgeleitet von QObject) in Qt über introspection aufrufbar zu machen reicht das verwenden des Q_INVOKABLE macros
Quelle: https://doc.qt.io/qt-5/qobject.html#Q_INVOKABLE
class Window : public QWidget { Q_OBJECT public: Window(); void normalMethod(); Q_INVOKABLE void invokableMethod(); };
Klar könnte man das ganze auch mit Macros erreichen. Was aber meist in einer längeren Übersetzungszeit mündet und die größe des Binary massiv erhöht.
CopperSpice bot einen Qt4 fork an, welches den moc durch Macros ersetzte.
Hier eine seite wo der CopperSpice fork mit moc und einem header only ansatz (Verdigris, welches große Teile der features des moc ersetzen kann) vergleicht.https://woboq.com/blog/verdigris-qt-without-moc.html
Und diese Seite bietet auch einen Übersicht über einiger moc Mythen an:
https://woboq.com/blog/moc-myths.html
-
@manni66 sagte in Anfänger sucht Anleitungen für C++/QT:
@john-0 das ist in Qt nicht anders.
Ah, ich bezog mich auf die Aussage von @It0101, dass Qt nicht so neues C++ nutzen würde. Mein persönlicher Erfahrungsschatz bei Qt beschränkt sich rein auf das Anwenden von Applikationen.
-
@john-0 sagte in Anfänger sucht Anleitungen für C++/QT:
@manni66 sagte in Anfänger sucht Anleitungen für C++/QT:
@john-0 das ist in Qt nicht anders.
Ah, ich bezog mich auf die Aussage von @It0101, dass Qt nicht so neues C++ nutzen würde. Mein persönlicher Erfahrungsschatz bei Qt beschränkt sich rein auf das Anwenden von Applikationen.
Und ich beziehe mich dabei hauptsächlich auf die Verwendung roher Pointer. Sowohl besitzende als auch nicht-besitzende.
-
Ok, dann ist das geklärt. Online schafft man es so leicht aneinander vorbei zu reden.