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.
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::string
zum anderen zu gelangenQString
.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.
quelle
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
new
fü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.quelle
new/delete
Aufrufen ist dies jedoch nicht so einfach und fehleranfällig. In kritischen Abschnitten (Umgang mit Big Data) kann dies einen Unterschied machen, insbesonderedelete
bei langsamen Anrufen.