Lernt C ++ durch das Qt Framework wirklich C ++ [closed]


32

Das Problem, das ich habe, ist, dass die meisten C ++ Bücher, die ich lese, fast immer für die Syntax und die Grundlagen der Sprache ausgegeben werden, z. B. für forSchleifen while, Arrays, Listen, Zeiger usw.

Aber sie scheinen nie etwas zu bauen, das einfach genug ist, um es zu lernen, und dennoch praktisch genug, um Sie dazu zu bringen, die Philosophie und die Kraft der Sprache zu verstehen.

Dann stieß ich auf QT , die eine erstaunliche Bibliothek ist!

Aber die Demos, die sie haben, scheinen sich in einem umgekehrten Dilemma zu befinden. Ich fühle mich wie der Sohn des reichen Mannes, der in einem vom Vater subventionierten Sportwagen herumfährt. Als ob ich fantastische Software bauen könnte, aber keine Ahnung habe, was unter der Haube vor sich geht.

Nehmen Sie als Beispiel für mein Dilemma die Aufgabe, einen einfachen Webbrowser zu erstellen. In reinem C ++ würde ich nicht einmal wissen, wo ich anfangen soll, aber mit der Qt-Bibliothek kann dies innerhalb weniger Codezeilen erfolgen.

Ich beschwere mich nicht darüber. Ich frage mich nur, wie ich die Wissenslücke zwischen der Grundstruktur der Sprache und der High-Level-Oberfläche füllen kann, die das Qt-Framework bietet.


Ich bin nicht vertraut mit der Programmierung in Qt. Führt es tatsächlich eine neue Syntax ein oder ändert es die Sprache oder sind es nur einige sehr hoch entwickelte Bibliotheken?
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner Es ist nicht QT das GUI Framework qt.nokia.com, wenn Sie interessiert sind
Karlson

Qt bietet auch eine Alternative zu Standardklassen und -containern (z. B. QString, QList usw.) und vielen anderen Einrichtungen. Einige von ihnen finde ich noch intuitiver als die Standard. Ich denke, es ist eine schöne Programmierumgebung, aber ich würde empfehlen, die Kernsprache C ++ separat zu lernen.
Giorgio

3
Wenn Sie erfahren möchten, wie Qt implementiert ist, laden Sie einfach den Quellcode herunter und sehen Sie ihn sich an.
user16764

1
@Karlson Qt erweitert die Sprache um einige Dinge, weshalb der moc aka MetaObject Compiler benötigt wird. Dies fügt etwas Reflexion hinzu und bildet die Basis des Qt-Signals / Slots-Systems.
Tamás Szelei

Antworten:


11

Möchten Sie wissen, wie das Gaspedal schneller fährt, oder interessiert es Sie nur, dass das Gaspedal schneller fährt?

Sie sehen den Vorteil der Black-Box-Programmierung, die eine großartige Möglichkeit ist, ein System zu entwerfen, wenn alle Boxen funktionieren. Jemand muss die Black Box machen und wenn du der Typ / das Mädchen sein willst, musst du mehr über die Sprache wissen als der Typ, der die Box benutzt.

Es gibt Jobs, die in jedem Stil gute Jobs sind. Es liegt also an Ihnen, was Sie programmieren möchten. IMO würden Sie sich selbst einen schlechten Dienst erweisen, wenn Sie sich nicht die Mühe machen würden, einen Teil der Abstraktion, die QT Ihnen letztendlich gibt, zurückzuziehen.


2
"Meiner Meinung nach würden Sie sich selbst einen schlechten Dienst erweisen, wenn Sie sich nicht die Mühe machen würden, einen Teil der Abstraktion, die QT Ihnen letztendlich gibt, zurückzuziehen." Ihr Recht und das ist das Bauchgefühl, das ich habe
user866190

18

Der größte Schaden, den Sie sich selbst antun werden, besteht darin, dass Sie nicht lernen, die Standard-C ++ - Datenstrukturen, -Iteratoren, -Algorithmen und -Strings überhaupt zu verwenden. Qt verfügt für all diese Zwecke über eigene Bibliotheken, und Sie müssen sie fast immer anstelle von Standard-C ++ - Entitäten verwenden, da Qt-APIs nur eigene Datenstrukturen akzeptieren.

Man könnte argumentieren, dass das Erlernen der Verwendung einer Algorithmusbibliothek nach dem Beherrschen einer anderen eine triviale Aufgabe ist. Bevor Sie zu einem Interview gehen, von dem die Interviewer erwarten, dass Sie C ++ beherrschen, sollten Sie sich zuvor mit dieser Trivialität befassen.


3
Agreed-Qt verwendet ein völlig anderes Toolset als Standard C ++.
DeadMG

In unserem Unternehmen gab es eine lange Debatte darüber, ob man die Standardcontainer und Iteratoren oder die Qt-Container verwenden sollte, und wir haben noch keine Lösung gefunden: Wir haben letztendlich beide verwendet, obwohl wir die beiden Stile in a nicht mischen gegebenes Modul. Ich habe das Gefühl, dass die Umstellung von Qt auf Standard konzeptionell sehr einfach ist, auch wenn dies einige Zeit in Anspruch nehmen wird.
Giorgio

9
Ich verwende die Standardcontainer und -algorithmen in meinen Konstruktionsmodellen, dh meiner Geschäftslogik. Ich verwende Qt-Container in meinem GUI-Code. Auf diese Weise sind meine Konstruktionsmodelle vor Änderungen in Qt geschützt und umgekehrt. Qt bietet Möglichkeiten, Standardcontainer und deren Container zu verbinden.
Emsr

2
Container sind mir sowieso egal. Sie sind nicht der nützlichste Teil der STL; Algorithmen sind viel wichtiger. Aufgrund des STL-Designs können die Algorithmen problemlos mit anderen Containern verwendet werden, und Qt-Container können mit STL-Algorithmen verwendet werden. Win-Win, wirklich.
MSalters

12

Angesichts der Tatsache, dass Qt einen eigenen Meta-Compiler hat, mit dem Sie Ihre Quelldateien verarbeiten müssen, ist es schwierig, Qt-Code als "nur C ++" zu betrachten.

Noch wichtiger ist jedoch, dass der Stil von C ++, den Qt verwendet und fördert, für den Rest von uns zuletzt um 1995 gesehen wurde.

Wirklich, es ist ein Versuch, C ++ so Java-ähnlich wie möglich zu machen. Es verpasst oder entmutigt all die erstaunlichen Dinge, die C ++ heutzutage wirklich wertvoll machen . Stattdessen sind Sie an eine Teilmenge gebunden, die sich vor allem wie ein minderwertiges Java anfühlt.

Wenn das Ziel darin besteht, C ++ zu lernen, würde ich nein sagen, meiden Sie Qt. Werfen Sie stattdessen einen Blick auf Boost, wenn Sie eine etablierte Bibliothek als Ausgangspunkt verwenden möchten. Boost verkörpert die Praktiken , die als gut angesehen werden heute .

Aber ehrlich gesagt, wenn Sie die C ++ - Sprache lernen möchten , dann holen Sie sich ein gutes Lehrbuch und konzentrieren Sie sich auf die Sprache .

Wenn Sie einen Webbrowser schreiben, egal wie Sie es tun, lernen Sie bestenfalls etwas über Webbrowser. Es wird Ihnen nicht viel über die Sprache beibringen, die Sie verwenden.

In C ++ als Sprache ist keine WebBrowser-Klasse integriert. Wenn Sie den C ++ - Standard lesen, wird nichts über Browser ausgesagt. Es werden nicht einmal GUI-Anwendungen erwähnt.

Das liegt daran, dass diese Dinge von Bibliotheken wie Qt darauf aufbauen . Wie in jeder Programmiersprache geht es auch in C ++ um Logik und darum, wie man diese Logik ausdrückt. Und ja, das bedeutet, mit Arrays und Zeigern und Schleifen und all diesen Dingen zu arbeiten.

Würden Sie in der Lage sein, einen Webbrowser mit nur diesen integrierten Tools zu schreiben, wenn Sie genügend Zeit haben ? Würdest du wissen, wie man die betreffende Programmlogik ausdrückt? Wenn nicht, müssen Sie mehr Zeit für Schleifen und Zeiger aufwenden und weniger Anrufe new QWebKit()tätigen und einfach vorgefertigte Bibliotheken huckepack nehmen.

Die "Philosophie und Kraft der Sprache" liegt in Arrays und Listen und Schleifen, nicht in Webbrowsern.


4
Ich habe nie gesagt, dass sie besser sind, weil sie neu sind . Sie sind neu und sie sind besser. Der Punkt ist, dass C ++ als Sprache für diesen Java-ähnlichen Ansatz einfach nicht sehr gut geeignet ist. In C ++ ist Vererbungs- und Laufzeit-Polymorphismus ein Manko, da Sie praktisch überall Heap-Zuweisungen für Objekte vornehmen müssen. Dies hat der Sprache in erster Linie den Ruf gegeben, dass Speicherlecks auftreten, weil sie zu Fehlern neigt, weil es erschwert das Kopieren von Objekten. Es ist auch ineffizient, weniger erweiterbar und erfordert langwierigeren Code.
Jalf

2
Zum Teufel, Qt benötigt einen eigenen Meta-Compiler , um seinen Programmierstil erträglich zu machen . Sagt dir das nicht etwas?
Jalf

4
Ich habe Qt nicht an sich verteidigt (ich sehe selbst viele Einschränkungen darin). Ihre Aussage "Der Stil von C ++, den Qt verwendet und fördert, wurde für den Rest von uns zuletzt um 1995 gesehen." Mit dieser Formulierung ist nicht klar, was an diesem Stil schlecht ist (außer dass er 15 Jahre alt ist) und was die aktuellen, besseren Alternativen sind. Vielleicht wird klarer, wenn Sie genauer sind, was Sie meinen.
Giorgio

3
@ JimInTexas: Es ist auch älter als C ++. Dein Punkt? In den frühen neunziger Jahren war C ++ ein ganz anderes Biest. Es war viel näher an dem, was schließlich zu Java wurde, als es heute ist.
Jalf

3
@JimInTexas: Ja, es ist falsch, aber es sollte hoffentlich auch ziemlich klar sein, was ich meine. Es ist ein Versuch, die Entwurfsziele von Java in C ++ zu erreichen. Es ist ein Versuch, dasselbe fehlerhafte OOP-Modell zu implementieren, das Java implementiert.
Jalf

9

Lernt C ++ durch das Qt Framework wirklich C ++

Vielleicht.

Ich müsste den Code sehen, den Sie in Ihre Event-Handler einfügen.

Aber sei nicht besessen davon, wie viel du "weißt". Wir alle verwenden Fenster-Frameworks und lernen noch. Schreiben Sie einfach weiter / lesen Sie neue Dinge und Sie werden weiterhin C ++ lernen. Das Erlernen eines neuen Fenster-Frameworks ist eine großartige Ergänzung Ihrer Fähigkeiten, auch wenn dies nicht bedeutet, dass Sie ein neuronales Netzwerk oder einen Quicksort in C ++ implementieren können.


5

Mach dir keine Sorgen; zunächst nur die meisten Ihrer Code verwenden , den Rahmen, aber nach einer Weile Sie müssen verlängern sie, wenn auch nur ein wenig. Dann müssen Sie immer mehr von C ++ verwenden.

Denken Sie auch daran, dass Ihnen die gesamte Qt-Quelle zur Verfügung steht. Die IDE führt Sie gerne zur Definition der gewünschten Funktion / Methode / Klasse. Je tiefer Sie gehen, desto mehr C ++ werden Sie sehen.

Andere haben den Unterschied zwischen Qt C ++ und Standard C ++ erwähnt. Diese fallen in zwei Lager:

  • andere Bibliothek: Qt enthält alle üblichen Container: Arrays, Listen, Mengen, Hashmaps usw. Sie passen sehr gut zusammen und sind gute Implementierungen, aber sie sind nicht die STD-Variante. In neueren Versionen (4.1 und höher, glaube ich) haben sie zusätzlich zur alten Variante (und einer Java-ähnlichen API) 'STD-ähnliche' APIs. Letztendlich sind die Entwurfsentscheidungen (wann ein Array verwendet werden soll, wann eine Hashmap verwendet werden soll) gleich, so dass der Wechsel zu STD für Nicht-Qt-Projekte nicht so schwierig ist.

  • mocSyntax-Ergänzungen: hauptsächlich für die Signalverarbeitung, aber auch für ein paar schönere Loop-Konstruktionen. Viele Leute glauben, dass dieses Tool nicht mehr C ++ ist. Aber meiner Meinung nach fühlen sie sich wie etwas schlauere Makros an. Eine gute, lose gekoppelte Signalverarbeitung ist ein großer Vorteil eines guten Frameworks, und es ist bekanntermaßen schwierig, eine statisch typisierte Sprache zu verwenden. In modernem C ++ ist dies mit einer großen Menge an Vorlagen möglich. Aber das war alles andere als Standard, als Qt zum ersten Mal kam moc. Wenn Sie später Nicht-Qt-Projekte durchführen möchten, überprüfen Sie am Ende zunächst, ob Sie ein Framework verwenden und ob es Signale enthält. Wenn ja, dann trifft das meiste, was Sie mit Qt gewohnt sind, zu. Es kann also nicht schaden, zuerst Qt zu lernen.


Welche Schleifenverbesserungen gibt es moc?
Basile Starynkevitch

@Basile Starynkevitch: Vielleicht bezieht er sich auf die foreach-Schleife (die ich stark benutze). Dies ist ein Syntaxzusatz, aber ASAIK hat nichts mit moc zu tun. Sie haben also Recht, dass die Antwort möglicherweise anders formuliert werden sollte.
Giorgio

foreachist nur ein Makro .... (eigentlich ein "Alias" in Q_FOREACHdefiniert <Qt/qglobal.h>). Ich glaube nicht, dass mocdas verarbeitet wird. Und C ++ 11 hat das for (auto it : container)Konstrukt!
Basile Starynkevitch

@Basile Starynkevitch: Wahrscheinlich würde Qt ein tiefgreifendes Reengineering benötigen, wenn es auf C ++ 11 umgestellt werden müsste: Qt wurde für C ++ entwickelt (und auch versucht, einige seiner Einschränkungen zu überwinden), daher werden einige seiner Lösungen mit C nicht benötigt ++ 11.
Giorgio

1
Ich benutze sowohl Qt als auch Boost. Es gibt viele Überschneidungen zwischen den beiden Bibliotheken, aber Qt ist viel einfacher zu lernen.
Jim In Texas

4

Qt ist in der Geschäftswelt weit verbreitet, da es ein vollständiges plattformübergreifendes Toolset und eine Entwicklungsumgebung bietet, einschließlich einer guten GUI-Bibliothek.

Es unterstützt auch die Internationalisierung in vollem Umfang, einschließlich des hervorragenden Tools "Linguist".

Wenn Sie eine akademische Karriere planen, würde ich mich nicht um Qt kümmern. Wenn Sie andererseits C ++ mögen und eine marktfähige Fertigkeit erlernen möchten, dann ist Qt das Erlernen wert.

Und ja, Qt ist C ++, und Sie können die Standard- und Boost-Bibliotheken nach Herzenslust mischen, wenn Sie sich dadurch besser fühlen.


3

Es ist eine schlechte Idee, C ++ durch Qt zu lernen. Zuerst müssen Sie die Sprachkonzepte unabhängig von einem Framework lernen, und genau das werden Sie in c ++ - Büchern lernen, und sie sind richtig. Grundsätzlich sind 'for und loops while, Arrays, Listen, Zeiger' das, worum es in Programmiersprachen geht. Zusätzliche Funktionen werden durch Frameworks bereitgestellt. Sobald Sie eine Programmiersprache gelernt haben, können Sie jedes Framework wie Qt oder MFC erlernen, das mit dieser Sprache erstellt wurde, sodass Anwendungen schnell entwickelt werden können. In Bezug auf Qt ist c ++ nach dem Erlernen ein hervorragendes Framework, das Sie so produktiv macht wie alle Java- oder .NET-Entwickler. In Kürze können Sie mit Qt iOS- und Android-Apps entwickeln.


2

Nun, ich denke, der beste Weg, um C ++ zu lernen, ist, NUR seine eigene Syntax zu verwenden (Standard C ++), so dass Sie in der Lage sein werden, das LANGUAGE-Zeug und NICHT das Qt (oder andere Frameworks, Bibliotheken usw.) zu verwenden.

Warum? Denn wenn Sie sich als Anfänger einen C ++ - Code ansehen, der mit einem anderen Nicht-C ++ - Code (in diesem Fall Qt) gemischt ist, können Sie nicht erkennen, was C ++ ist und was nicht, sondern es ist ein komplexerer Prozess.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.