QT-C ++ vs. generisches C ++ und AWL [geschlossen]

19

Ich habe in letzter Zeit mein C ++ auf Ubuntu QQ aufgefrischt. Ich liebe das Qt-Framework für alles, besonders für das Erstellen von GUIs. Ich habe mich in den letzten Jahren mit PyQt vertraut gemacht.

Bei der Verwendung von PyQt gab es einige Probleme, die jetzt bei der Verwendung von C ++ mit Qt deutlicher wurden: Qt hat viele Qt-spezifische Erweiterungen für C ++ - QString ist nur ein häufiges Beispiel, ganz zu schweigen von der automatisierten Garbage Collection. Es ist möglich, Qt-Anwendungen mit C ++ zu schreiben, ohne viel über C ++ und die STL zu wissen.

Ich muss vielleicht bald wieder auf den Arbeitsmarkt und würde gerne C ++ - Stellen in Betracht ziehen - aber ich befürchte, dass eine zu starke Bindung an Qt meine Fähigkeiten zur Arbeit mit generischem C ++ einschränken wird, was früher sehr beeindruckend war sind jetzt lange ruhend und rostig.

Sollte ich Qt vermeiden? Wäre es besser, WxWidgets oder GTK ++ zum Erstellen von GUIs zu verwenden?

Was ist das beste GUI-Framework, das die Verwendung von generischem C ++ und der STL ermöglicht / erfordert? Wie mache ich mich als C ++ - Programmierer am marktfähigsten, wenn es um GUI-Frameworks usw. geht?

Vektor
quelle

Antworten:

15

Ich würde nicht nur aus diesen Gründen auf Qt verzichten. Sie müssen nicht alle Dienstprogrammklassen von Qt verwenden. Für diejenigen, die die STL ersetzen, müssen Sie höchstens QString und möglicherweise QStringList verwenden. Außerdem gehört zu einem Programm in der Regel viel mehr als die grafische Benutzeroberfläche. Sie können für den Rest Ihres Programms immer ausschließlich generisches C ++ verwenden und Qt nur für die GUI verwenden.

Meiner Meinung nach geht es bei der Arbeit mit STL eher darum, zu verstehen, welche zugrunde liegenden Datenstrukturen verwendet werden und wie komplex sie sind, und folglich zu welchen Zeiten Sie jeden Container verwenden sollten. Und wenn es um C ++ - Programmierung geht, geht es vor allem darum, zu wissen, wie der sehr wichtige <algorithm> -Header verwendet wird, der auch für die Container von Qt funktionieren sollte, da sie STL-kompatibel sind.

Ich sehe keinen großen Schaden in der Verwendung all dieser Erweiterungen, die Qt bereitstellt, solange Sie wissen (oder zumindest eine allgemeine Vorstellung davon haben), wie sie intern implementiert sind. Stellen Sie sicher, dass Dinge wie Q_OBJECT, SIGNAL (), SLOT (), foreach () keine Magie sind, sondern Makros, die zu gültigen C ++ - Anweisungen erweitert werden. Zum Beispiel ist es nicht allzu kompliziert zu verstehen, wie die implizit geteilten Klassen und Eltern-Kind-Beziehungen implementiert werden, die Qt Java-ähnlicher erscheinen lassen. Sie können immer versuchen, einige Funktionen in einem separaten Projekt neu zu erstellen, um zu prüfen, ob Sie sie mit generischem C ++ ausführen können, und sich dann nicht schlecht fühlen, wenn Sie sie in Qt verwenden.

Schauen Sie sich auch die Boost-Bibliotheken an. Sie bieten zusätzliche Dienstprogramme, die die Standard-C ++ - Bibliothek nicht bietet, und sind ein guter Weg, um generischem C ++ ein Stück näher zu kommen, da sie im Wesentlichen denselben Konventionen folgen wie generischem C ++. Einige der Bibliotheken haben ziemlich komplexe Klassen mit Vorlagen, und der Versuch, einfach zu verstehen, wie sie funktionieren, ist an sich schon eine gute Studie in C ++. Boost hat viele Dienstprogramme, die in Qt nicht zu finden sind, und andere, die dieselben oder ähnliche Konzepte wie einige der Klassen von Qt implementieren und an deren Stelle verwendet werden können.

Wenn Sie mit C ++ auf den Arbeitsmarkt kommen, besteht die Möglichkeit, dass Sie mit Qt oder einem anderen Framework arbeiten, das ebenfalls über eigene Utility-Klassen verfügt, die versuchen, C ++ zu vereinfachen.

LLLL
quelle
4
+1 für "Sie können für den Rest Ihres Programms immer ausschließlich generisches C ++ und Qt nur für die GUI verwenden."
Md Mahbubur Rahman
@ MahbuburRAaman - ja - das ist ein ausgezeichneter Rat. Verwenden Sie Qt nur für die grafische Benutzeroberfläche und das, was zum Einhängen in back erforderlich ist. Schreiben Sie den Rest mit Generic C ++, STL, Boost - den Tools, die universell eingesetzt werden.
Vector
5

Ich stimme den meisten von Qt sehr zu, aber die Frage war: Was ist das beste GUI-Framework, das die Verwendung von generischem C ++ und der STL erlaubt / erfordert? In dieser Hinsicht ist Qt ein wenig schizophren: Es dupliziert STL-Container und -Algorithmen mit eigenen Drehungen. Es werden auch Container bereitgestellt, die sich von STL unterscheiden. Die Interoperabilität zwischen Qt und STL ist nicht immer reibungslos. In einigen Fällen sind einige Funktionsaufrufe erforderlich, um von einem std::stringzum anderen zu gelangen QString.

wxWidgets bietet eine Option für den STL-Build, bei der ausschließlich STL-Container verwendet werden - es gibt kein paralleles Universum mit selbst erstellten Ersetzungen wie im Fall von Qt. Es kann auch mit einem Standard-C ++ - Compiler kompiliert werden, ohne dass nicht standardmäßige Erweiterungen erforderlich sind. Es handelt sich um ein qualitativ hochwertiges GUI-Framework, das eine Überlegung wert ist.

Sie können auch einen Blick auf ein gtkmm werfen, das ein C ++ - Wrapper um GTK + ist. Es ist der Erfüllung Ihrer ersten Anforderung näher als Qt.

Paul Jurczak
quelle
1
'wxWidgets hat eine Option für den STL-Build, die ausschließlich STL-Container verwendet ...' - ich verstehe - das ist WICHTIG zu wissen. 'In einigen Fällen sind einige Funktionsaufrufe erforderlich, um von std :: string zu QString zu gelangen' - verstanden - ich habe es noch nicht untersucht. Ich bin ein bisschen vertraut mit GTK und Wx - aber Qt scheint im Vergleich zu glänzen, zumindest aus meiner Sicht. C ++ ist NICHT meine Muttersprache. Ich kam aus der Clipper / Delphi-Welt und lernte dann C ++, weil ich mich mit Win auseinandersetzen musste 32s etc.
Vector
2

Ich würde mir keine Sorgen machen, wenn ich bestimmte STL-Bibliotheken wie std :: string oder std :: iostream oder std :: vector nicht verwenden würde. Die QT-Äquivalente haben einen anderen Geschmack, aber sie sind nicht so weit entfernt, um ein Problem zu machen.

Der meiner Meinung nach idiomatischere Unterschied scheint der Programmierstil zu sein, der newfür die Zuweisung verwendet wird. Während dies für ein QT-Programm für den Gui-Teil in Ordnung sein könnte, besteht die Tugend von C ++ und RAII darin, dass Sie tatsächlich viele Daten auf dem Stapel anstatt auf dem Heap behalten können. Wenn Sie zum Schreiben von Code ohne GUI wechseln, sollten Sie sich daran erinnern.

wirrbel
quelle
1
Der Punkt, den ich anstrebte, ist nicht, dass die Heap-Zuweisung im Allgemeinen schlecht ist, sondern, dass dies nicht das Beste für lokale Variablen ist. GUI-Klassen leben in der Regel lange und werden am besten auf dem Heap zugeordnet. Lokale Variablen, die nur vorübergehend benötigt werden, leben gut auf dem Stack. In C # mit Garbace Collection werden sie bald zerstört, daher ist Heap auch in Ordnung. Bei manuellen new/deleteAufrufen ist dies jedoch nicht so einfach und fehleranfällig. In kritischen Abschnitten (Umgang mit Big Data) kann dies einen Unterschied machen, insbesondere deletebei langsamen Anrufen.
Wirrbel
1
Dies ist kein Problem von 10000 UI-Objekten, sondern für komplexe Baumdatenstrukturen mit einer Million Einträgen usw., bei denen früher intelligentere Methoden zur Zuweisung von Dingen verwendet wurden (Bulk-Zuweisung oder viele intelligent geschriebene Boost-Klassen usw.). Fazit: Der Heap ist nicht schlecht, er muss intelligent genutzt werden. Der Qt-Weg skaliert manchmal nicht für andere Dinge. Meiner Meinung nach ist es immer noch ein großartiges Toolkit.
Wirrbel
Wie wäre es mit C ++ 11? Intelligente Zeiger usw. scheinen viele Ihrer Bedenken auszuräumen. Ich fange gerade an, mich damit zu beschäftigen. Wie gesagt, ich stimme zu, dass Qt KICKS BUTT. Mein Plan ist es, Qt für die grafische Benutzeroberfläche zu verwenden und mit C ++ 11 alles zu tun, was ich sonst noch kann - was Boost anscheinend weitgehend überholt und die Lücken zwischen Java / C # und C ++ der alten Schule zu einem großen Teil schließt. Ich habe das Gefühl (aus der Ferne zugegeben), dass eine Kombination aus Qt und C ++ 11 ein großer Gewinner sein kann.
Vector
2
Ich denke, Sie haben meine Argumente: Sie haben viele Optionen mit C ++, mit C ++ müssen Sie mit Bedacht wählen. Intelligente Zeiger usw. haben ebenfalls Probleme. Wenn Sie C # satt haben, können Sie sich dlang.org ansehen, das viele Dinge besser macht (GCed).
Wirrbel
In der Zwischenzeit muss ich eine Toolkette zusammenstellen, die C ++ 11 unterstützt. Ich verwende derzeit Codelite - eine sehr schöne IDE - aber wie ich gerade herausgefunden habe (GNU-Compiler), unterstützt es 11 nicht. Vielleicht habe ich kann einen 11-kompatiblen Compiler anschließen. Ich werde nicht mit D, Boo usw. usw. anfangen - wie ich bereits sagte, muss ich möglicherweise bald wieder auf den Arbeitsmarkt und möchte die gängigen Sprachen für die Marktreife, nicht die "One Offs". VIELE Python-Jobs da draußen - schade, dass ich Python nicht mehr ausstehen kann!
Vector