{"id":990,"date":"2026-05-03T12:01:15","date_gmt":"2026-05-03T10:01:15","guid":{"rendered":"https:\/\/thurow.de\/?p=990"},"modified":"2026-05-03T12:26:49","modified_gmt":"2026-05-03T10:26:49","slug":"qt-ein-wertvoller-und-eigenwilliger-freund-teil-1","status":"publish","type":"post","link":"https:\/\/thurow.de\/?p=990","title":{"rendered":"Qt &#8211; ein wertvoller und eigenwilliger Freund Teil 1 &#8211; Grundlagen"},"content":{"rendered":"\n<p>In Bereich der 3D-Messwerterfassung und -visualisierung ist mir <a href=\"https:\/\/de.wikipedia.org\/wiki\/Qt_(Bibliothek)\" target=\"_blank\" rel=\"noreferrer noopener\">Qt<\/a> zu einem der wichtigsten Werkzeuge geworden. Geometriedaten in 3D zu verarbeiten und zu visualisieren bedeutet in der Regel, Hardware sehr effizient f\u00fcr Berechnungen und Visualisierung zu nutzen. Und das bedeutet direkte Kontrolle von CPU und GPU. Sprach-Werkzeuge daf\u00fcr sind C++ und Shader. Qt spielt in diesem Bereich in der Industrie seine St\u00e4rken aus, besonders plattform\u00fcbergreifend. Auch im automotiv-Sektor, und dieser ist bekannterma\u00dfen einer der Motoren in der Entwicklung der IT.<\/p>\n\n\n\n<p>Qt l\u00f6st hier mehrere Probleme gleichzeitig. CPU und GPU k\u00f6nnen mit C++ und <a href=\"https:\/\/de.wikipedia.org\/wiki\/OpenGL_Shading_Language\" target=\"_blank\" rel=\"noreferrer noopener\">GLSL<\/a> (Qt 6: Vulkan-Stil) sehr direkt programmiert werden. Der Pferdefu\u00df: Bevor \u00fcberhaupt der erste eigene Shader l\u00e4uft, muss im C++-Teil erst Infrastruktur stehen, und zwar eine Menge:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Render-\/Materialobjekte sauber erzeugen<\/li>\n\n\n\n<li>Shader-Dateien laden oder einbinden<\/li>\n\n\n\n<li>Uniforms\/Parameter \u00fcbergeben<\/li>\n\n\n\n<li>Geometrieattribute passend bereitstellen<\/li>\n\n\n\n<li>Pipeline\/Layout\/Bindings konsistent halten<\/li>\n\n\n\n<li>Fehlerausgabe und Reloading\/Debugging erm\u00f6glichen<\/li>\n\n\n\n<li>Backend-spezifische Anforderungen erf\u00fcllen<\/li>\n<\/ul>\n\n\n\n<p>Und hier bietet Qt sozusagen das gemachte Nest. Sogar mit plattformunabh\u00e4ngiger Transparenz des Backends, ob es nun OpenGL(ES), Vulkan, Direct3D oder Metal wird. <strong>Real<\/strong>, nicht als verkaufter &#8222;Traum&#8220;.<\/p>\n\n\n\n<p>Zus\u00e4tzlich bringt Qt eine gute L\u00f6sung des bekannten Frontend \/ Backend Problems. Sprachen wie C++ sind hervorragend f\u00fcr Aufgaben zur hardwarenahen Programmierung geeignet, das ist auch die &#8222;Kinderstube&#8220; von C++. Ich sage der Hardware ziemlich direkt, was sie wann wie zu tun hat.<\/p>\n\n\n\n<p>F\u00fcr das Frontend ist eine andere Denkweise erforderlich. Hier soll die Konzentration auf UI und UX liegen, daher werden andere, einfach gehaltene, deklarative Sprachen eingesetzt, die beschreiben, wie etwas aussehen bzw. reagieren soll. Die Komplexit\u00e4t soll hier im Gegensatz zum Backend mit Absicht verborgen werden. <\/p>\n\n\n\n<p>Beide Welten m\u00fcssen verheiratet werden. Qt bietet als Frontend-Sprache QML (Qt Modeling Language) an und verheiratet diese mit C++ vergleichsweise einfach. Basis ist JavaScript als Logik-Schicht, mit Property Bindings und &#8222;Event&#8220;-Handling.<\/p>\n\n\n\n<p>Und hier kommt ein weiterer Vorteil von Qt: es erweitert C++ um Signale im Sinne von <a href=\"https:\/\/de.wikipedia.org\/wiki\/Objective-C\" target=\"_blank\" rel=\"noreferrer noopener\">Objective-C<\/a>. Statt klassischer Events in anderen UI-Tools baut es auf einen Signal-Slot Ansatz, umgeht damit generische Event-Objekte und erm\u00f6glicht eine direkte semantische Bedeutung ohne Event-Kaskade.<\/p>\n\n\n\n<p>Damit sind die beiden wesentlichen Bausteine f\u00fcr die Verbindung von Frontend- und Backend-Welt gelegt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Signals<\/strong><br>Ereignisse ausl\u00f6sen und auf diese reagieren <\/li>\n\n\n\n<li><strong>Bindings<\/strong><br>Zustandslogik auslesen<\/li>\n<\/ul>\n\n\n\n<p>Der Preis wird in der Umsetzung bezahlt. Damit kommen wir zum Meta-Object-System.<\/p>\n\n\n\n<p>C++ ist kein Objective-C. Wie kommen wir also zu Signalen und Slots? Die Antwort: sie werden selbst wieder in C++ Code umgesetzt. Und nicht nur diese. Qt legt einen ganzen zus\u00e4tzlichen Reflexions- und Messaging-Layer \u00fcber C++, in C++ selbst wieder realisiert. Dazu dient ein Meta Object Compiler, der den Eingangs-C++ Code analysiert und zus\u00e4tzlichen C++-Code generiert. Urspr\u00fcnglicher und zus\u00e4tzlich generierter Code werden dann zusammen kompiliert. <\/p>\n\n\n\n<p>So genial dieser Ansatz ist, er bringt einen ganzen &#8222;Blumenstrau\u00df&#8220; von Eigenwilligkeiten mit sich, mit denen der Qt-Entwickler dann t\u00e4glich zu k\u00e4mpfen hat. So werden manche Fehler erst zur Laufzeit sichtbar und das Debugging ist durch den indirekten Call-Stack, sagen wir mal, tricky. <\/p>\n\n\n\n<p>Weiter trennt Qt extrem strikt zwischen \u00f6ffentlicher, stabiler API und beweglicher interner Implementierung, viel l\u00e4uft \u00fcber PIMPL (Pointer to Implementation). Wenn es kracht, steht man im Debugging vor einem nichtssagenden d-pointer. Und Qt ist hier leider eher ein Sensibelchen. Module wie BLE lassen sich sehr leicht in instabile Zust\u00e4nde versetzen, man kann hier sehr schnell bei der Fehlersuche an der &#8222;black box&#8220; verzweifeln. Es ist etwas wie Magie, im Guten wie im Schlechten.<\/p>\n\n\n\n<p>Und dennoch, ich pers\u00f6nlich wei\u00df Qt immens zu sch\u00e4tzen. Denn dieses Framework gibt mir genau das, was in meinem Bereich z\u00e4hlt: direkt verzahnte Frontend- und Backend-Entwicklung bei echter plattformunabh\u00e4ngiger, und dennoch hardwarenaher Kontrolle, sowohl f\u00fcr CPU wie GPU.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Bereich der 3D-Messwerterfassung und -visualisierung ist mir Qt zu einem der wichtigsten Werkzeuge geworden. Geometriedaten in 3D zu verarbeiten und zu [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,23,9],"tags":[29,28,12],"class_list":["post-990","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-embedded-programmierung","category-programmierung","tag-c-2","tag-embedded","tag-programmierung"],"_links":{"self":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/990","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=990"}],"version-history":[{"count":5,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/990\/revisions"}],"predecessor-version":[{"id":995,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/990\/revisions\/995"}],"wp:attachment":[{"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}