Soweit ich weiß und in meiner Erfahrung mit Qt verstanden habe, ist es eine sehr gute und leicht zu erlernende Bibliothek. Es hat eine sehr gut gestaltete API und ist plattformübergreifend. Dies sind nur zwei der vielen Funktionen, die es attraktiv machen. Ich bin gespannt, warum mehr Programmierer Qt nicht verwenden. Gibt es einen Mangel, der dagegen spricht? Welche Eigenschaft macht andere Bibliotheken besser als Qt? Hat das Problem mit der Lizenzierung zu tun?
202
delete
" hinaus. Die Tatsache, dass die intelligenten Zeiger dies explizit machen, ist kein Sprachfehler. und wenn Sie nicht über solche Dinge nachdenken, werden Sie Müll in jeder höheren Sprache erzeugen, die ich auch gesehen habe.Antworten:
Ich habe nicht wirklich vor, dass dies eine heftige Antwort ist, aber das sind die Gründe, warum ich Qt nicht persönlich benutze. Es gibt viele gute Dinge darüber zu sagen - nämlich, dass die API die meiste Zeit funktioniert und Plattformen nahtlos überbrückt. Aber ich benutze Qt nicht, weil:
vim
.quelle
Wie die Leute sagen, passt jedes Tool zu jedem Problem und jeder Situation ...
Wenn Sie jedoch C ++ - Programmierer sind, ist Qt Ihr Framework. Kein Rivale.
Wir entwickeln eine komplexe kommerzielle Anwendung für die medizinische Bildgebung, und Qt hält an.
Ich sage nicht, dass die Nachteile, die die Leute darüber sagen, falsch sind, aber ich habe das Gefühl, dass sie Qt schon lange nicht mehr ausprobiert haben (es verbessert sich ständig mit jeder neuen Version ...). Und meistens Alle Probleme, die sie kommentieren, sind kein Problem, wenn Sie aufpassen.
Inkonsistenz der Benutzeroberflächenplattform: Nur wenn Sie die Benutzeroberflächen-Widgets unverändert verwenden, ohne Anpassungen oder benutzerdefinierte Grafiken.
Qt-Präprozessorüberlastung: Nur wenn Sie den Signal-Slot-Mechanismus oder die QObject-Vererbung missbrauchen, wenn dies nicht wirklich erforderlich ist.
Übrigens schreiben wir immer noch Anwendungen in C # .NET, und das schon lange. Ich glaube, ich habe eine gute Perspektive.
Wie gesagt, jedes Werkzeug für jede Situation,
Aber Qt ist zweifellos ein konsistenter und nützlicher Rahmen.
quelle
Von all den Dingen, die ich an Qt nicht mag, nervt mich die Tatsache, dass es nicht gut mit Vorlagen funktioniert. Das kannst du nicht machen:
Es spielt auch nicht gut mit dem Präprozessor. Das kannst du nicht machen:
Dies, zusammen mit der Tatsache, dass alles, was auf ein Signal reagiert, ein Q_OBJECT sein muss, macht es schwierig, in Qt für einen C ++ - Programmierer zu arbeiten. Die Leute, die an Java oder Python gewöhnt sind, sind wahrscheinlich tatsächlich besser.
Tatsächlich habe ich viel Zeit und Mühe aufgewendet, um einen Weg zu finden, um die Typensicherheit wiederherzustellen und ein Qt-Signal mit einem beliebigen Funktionsobjekt zu verbinden: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals -in-qt-step-1.html
Was ich dort machen möchte, ist eine einfache, alltägliche C ++ - Entwicklung, die durch den Qt moc so gut wie unmöglich gemacht wurde ... was heutzutage selbst völlig unnötig ist, wenn es jemals tatsächlich so war.
Ehrlich gesagt bin ich dabei geblieben, denn wenn Sie automatisierte UI-Tests durchführen möchten, ist Qt so ziemlich das einzige Spiel in der Stadt, das nicht über MFC verfügt. Einige sagen vielleicht WX, aber es gibt noch ernstere Probleme. GTKmm wäre meine erste Wahl gewesen, aber da alles vom Eigentümer gezeichnet wurde und keine Barrierefreiheit bietet, kann es nicht mit einer branchenüblichen Testsoftware betrieben werden. Qt ist in dieser Hinsicht schwierig genug ( funktioniert kaum, wenn Sie das Accessibility-Plugin ändern).
quelle
Ein Grund, Qt nicht zu verwenden, ist, dass Sie, wenn Sie nur für eine Architektur wie Windows schreiben, möglicherweise C # /. NET (oder Cocoa auf Mac) verwenden möchten, da diese stets die neuesten Funktionen nutzen können -Pfeifen des Betriebssystems.
Wenn Sie plattformübergreifende Apps schreiben, sind Sie möglicherweise bereits stark an einer anderen Technologie wie Java interessiert (dh Sie arbeiten in einem "Java-Shop"). Ihre Wahl der Technologie hängt möglicherweise von dem Ökosystem ab, in dem Sie entwickeln, z. B. von sprachspezifischen APIs. In solchen Fällen kann die Minimierung der Anzahl der Technologien von Vorteil sein.
Ein dritter Grund, den ich mir vorstellen kann, ist, dass Qt auf C ++ basiert und C ++ eine vergleichsweise schwierige / gefährliche Programmiersprache ist. Ich denke, es ist eine Sprache für Profis. Wenn Sie Spitzenleistung benötigen und in der Lage sind, akribisch zu sein, ist C ++ wahrscheinlich immer noch das beste Spiel der Stadt. Tatsächlich verbessert Qt viele der Speicherverwaltungsprobleme, wenn Sie festlegen, dass Dinge außerhalb des Bereichs fallen. Außerdem leistet Qt selbst gute Arbeit, indem es den Benutzer von vielen unangenehmen C ++ - Problemen isoliert. Jede Sprache und jeder Rahmen hat Vor- und Nachteile. Es ist ein sehr, sehr kompliziertes Thema, das sich in der Regel durch die Addition zusammenfassen lässt, die häufig bei Gästen zu finden ist: Geschwindigkeit, Qualität und Preis (Sie können jedoch nur zwei auswählen).
Obwohl die Regeln vorschreiben, dass ich mich weiterhin auf die Beantwortung der Frage konzentrieren sollte, möchte ich einige der von Billy ONeal angesprochenen Fragen, der meiner Meinung nach gute Arbeit leistet und die häufig genannten Gründe für die Nichtverwendung von Qt zusammenfasst, zurückweisen:
Qt ist in der Tat eine C ++ - Bibliothek / Framework / Header-Dateien. Es ist erweitertdurch einen Makroprozessor (moc), der unter anderem Signale und Slots ermöglicht. Es transformiert zusätzliche Makrobefehle (wie Q_OBJECT), sodass Klassen eine Selbstbeobachtung und alle möglichen anderen Extras haben, die Sie möglicherweise als Hinzufügen von Objective-C-Funktionalität zu C ++ betrachten. Wenn Sie genug über C ++ wissen, um von diesem Mangel an Reinheit beleidigt zu werden, dh, Sie sind ein Profi, dann 1) verwenden Sie Q_OBJECT und seine Eigenschaften nicht oder 2) seien Sie dankbar, dass es dies tut, und programmieren Sie um die sehr begrenzten Eckfälle herum wo dies ein Problem verursacht. Für Leute, die sagen "Verwenden Sie Boost für Signale und Slots!" dann würde ich erwidern, dass Sie ein "Problem" gegen ein anderes austauschen. Boost ist riesig und hat seine eigenen häufig genannten Probleme wie schlechte Dokumentation, horrende APIs und plattformübergreifende Horrors (denken Sie an alte Compiler wie gcc 3).
Für die Editorunterstützung ergibt sich dies auch aus 1, da stimme ich einigermaßen zu. Tatsächlich ist Qt Creator meiner Meinung nach der beste grafische C ++ - Editor, auch wenn Sie das Qt-Zeug nicht verwenden. Viele professionelle Programmierer verwenden Emacs und Vim. Ich denke auch, dass Eclipse die zusätzliche Syntax handhabt. Somit keine Probleme mit den Qt-Makros (Q_OBJECT) oder Signal / Slot-Zusätzen. Sie werden diese Makros wahrscheinlich nicht in Visual Studio finden, da sie (wie ich zugebe) Ergänzungen zu C ++ sind. Aber im Großen und Ganzen werden C # /. NET-Leute Qt ohnehin nicht verwenden, da sie einen Großteil der Funktionen haben, die mit ihren eigenen proprietären Techniken abgedeckt werden.
Wen interessiert es, wie groß die Qt-Quelle ist, solange sie über Nacht kompiliert wird? Ich habe Qt 4 auf meinem Dual-Core-Macbook in "weniger als über Nacht" kompiliert. Ich hoffe sicherlich, dass dies nicht der Grund für Ihre Entscheidung ist, eine bestimmte Technologie zu verwenden oder nicht zu verwenden. Wenn dies wirklich ein Problem ist, können Sie die vorkompilierten SDKs für Mac, Linux und Windows von der Qt-Website herunterladen.
Die Lizenzierung ist in drei Varianten möglich: 1) Proprietäre Lizenz für den Fall, dass Sie Qt ITSELF ändern und nicht freigeben möchten oder die Tatsache verbergen möchten , dass Qt verwendet wird und nicht bereit ist, Angaben zu machen (kann für Branding und Image sehr wichtig sein!). 2 ) GPL und 3) LGPL. Ja, es gibt Probleme mit statischen Verknüpfungen (alle Qt in die Binärdatei rollen) - aber ich denke, das ist mehr, weil man nicht hineinschauen kann und merkt, dass Sie Qt verwenden (Attribution!). Ich habe versucht, eine proprietäre Lizenz von Digia zu kaufen, und sie sagten mir, "für das, was Sie tun, brauchen Sie sie wirklich nicht." Beeindruckend. Von einem Unternehmen, das Lizenzen verkauft.
Die Größe des Binarys / Bundles liegt daran, dass Sie das Qt-Zeug an Leute verteilen müssen, die es nicht haben: Windows hat es bereits? das Visual Studio Zeug oder Sie müssen die Laufzeit installieren. Mac kommt bereits mit dem riesigen Kakao und kann dynamisch verknüpft werden. Obwohl ich nicht viel verteile, habe ich nie große Probleme mit der Verteilung der ~ 50 Megabyte großen statischen Datei (die ich mit einigen binären Stripper- / Komprimierungsprogrammen wie UPX noch verkleinern kann). Ich kümmere mich einfach nicht genug darum, aber wenn Bandbreite jemals ein Problem wäre, würde ich meinem Build-Skript einen UPX-Schritt hinzufügen.
Was bedeutet "Natives Aussehen und Gefühl"? Ich denke, "die meisten" würden zustimmen, dass der Mac dem einheitlichen Erscheinungsbild am nächsten kommt. Aber hier sitze ich und schaue mir Safari, iTunes, Aperture, Final Cut Pro, Pages usw. an und sie sehen nicht gleich aus, obwohl sie vom Betriebssystemhersteller hergestellt wurden. Ich denke, der Aspekt "Gefühl" ist relevanter: Widget-Stil, Reaktionsfähigkeit usw. Wenn Sie sich für Reaktionsfähigkeit interessieren, ist dies ein guter Grund, C ++ anstelle von Java oder einer anderen hochdynamischen Sprache zu verwenden. (Ziel C rockt auch, aber ich versuche, Mythen über Qt zu zerstreuen)
Zusammenfassend ist es ein kompliziertes Problem. Ich möchte jedoch darauf hinweisen, dass es meines Erachtens weniger Gründe gibt, Qt nicht zu verwenden, als man aufgrund von Mythen und veralteten Informationen annehmen könnte.
quelle
Ein Teil davon ist Lizenzierung. Unter https://en.wikipedia.org/wiki/Qt_(software)#Licensing finden Sie Informationen zum Lizenzverlauf. Bis zum Jahr 2000 nutzten Menschen, die sich stark für Open Source interessierten, Qt nicht. Zeitraum. (Dies war in der Tat die ursprüngliche Motivation für die Entwicklung von Gnome.) Bis 2005 verwendeten Leute, die freie Software für Windows veröffentlichen wollten, Qt nicht. Selbst nach diesem Datum hatten Leute, die freie Software unter etwas anderem als der GPL wollten, einfach keine Möglichkeit, Qt zu verwenden. Daher kann kein freies Softwareprojekt, das älter als diese Daten ist, Qt verwenden. Und natürlich mussten Leute, die proprietären Code schrieben, für das Privileg bezahlen.
Darüber hinaus ist es nicht so, dass es an anderen Optionen mangelt. Zum Beispiel WxWidgets , GTK + und Tk sind alle Open Source, Cross-Plattform - Toolkits.
Außerdem war Windows auf dem Desktop lange Zeit so dominant, dass eine Menge Software nur unter Windows ausgeführt werden konnte. Wenn Sie die Microsoft-Toolchain installieren, ist es einfacher, das proprietäre Material von Microsoft zu verwenden, als sich um alles andere zu kümmern, und viele Programmierer haben genau das getan.
quelle
Ich stimme fast allen oben diskutierten Gründen zu, aber viele Leute hier haben gesagt, sie würden Qt nicht verwenden, weil es zusätzlichen Overhead mit sich bringt. Ich bin damit nicht einverstanden, weil alle gängigen Sprachen (Java, C # und Python) selbst einiges an Aufwand verursachen.
Zweitens macht Qt das Programmieren mit C ++ so einfach und unkompliziert, dass es die zusätzlichen Ressourcen, die es verwendet, wieder wettmacht. Ich bin auf eine ganze Reihe von Konsolenanwendungen gestoßen, die in Qt und nicht in Standard-C ++ geschrieben wurden, weil sie einfach zu schreiben sind.
Ich würde sagen, dass die Produktivität von Qt höher ist als die von C / C ++, aber niedriger als die von Sprachen wie Python.
quelle
Dies ist wirklich kein Versuch, einen Flammenkrieg auszulösen, ich wollte nur einige der Punkte ansprechen.
Wahrscheinlich ist der wahre Grund dafür, dass Qt nicht so verbreitet ist, dass es C ++ ist und weniger Menschen C ++ für Desktop-Apps verwenden.
Das vs-Addin für Visual Studio erledigt dies automatisch, ebenso wie Qts eigener Kommandozeilen-Make-Prozess. Der Ressourcen-Compiler, der zum Erstellen der Dialoge für MFC verwendet wird, ist ebenfalls ein separater Schritt, aber das ist immer noch C ++.
Es gibt einen binären Download für jede Version von Visual Studio und der Build aus dem Quellcode ist ein einziger Befehl. Ich sehe nicht, dass die Größe der SDK-Quelle heutzutage so wichtig ist. Visual Studio installiert jetzt alle C ++ - Bibliotheken und lässt Sie nicht mehr auswählen. Daher ist die Installationsgröße des Compilers> 1 GB.
Die LGPL bezieht sich nur auf die Bibliothek, nicht auf Ihren Code. Ja, es bedeutet, dass Sie DLLs anstatt einer einzelnen Binärdatei ausliefern müssen (es sei denn, Sie zahlen dafür), aber in einer Welt, in der Sie eine Java-Laufzeit oder ein .Net-Update für eine winzige Anwendung herunterladen müssen, ist dies keine so große Sache. Auf Plattformen mit einem einzigen ABI ist dies auch weniger problematisch, sodass andere Qt-Apps die Bibliotheken gemeinsam nutzen können.
Es soll native Widgets und Themes verwenden. Ich muss zugeben, dass ich hauptsächlich technische Apps mache, damit sich meine Benutzer nicht zu sehr um den Stil kümmern. Besonders unter Windows bedeutet die neue Mode, dass sich alles wie ein Smartphone-Widget anfühlt, dass es sowieso immer weniger Standards gibt.
quelle
Der Grund ist einfach: Es gibt keine guten Bindungen zu allen gängigen Sprachen und es ist nicht immer magisch passend für den jeweiligen Job.
Verwenden Sie das richtige Werkzeug für den Job. Wenn ich eine einfache Befehlszeilenanwendung schreibe, warum sollte ich das mit Qt aufblähen, nur um es zu tun?
Als allgemeinere Antwort (die ich geben kann, weil ich hier relevant bin) haben einige Programmierer es einfach nie ausprobiert und beschlossen, es zu verwenden. In einigen Fällen gibt es keinen besonderen Grund, außer dass der Programmierer nie einen Bedarf dafür gefunden und sich damit befasst hat.
quelle
Frameworks wie Qt sind geeignet, wenn Sie sich mehr darum kümmern, dass Ihr Produkt auf allen Plattformen gleich aussieht, als dass Ihr Produkt auf allen Plattformen richtig aussieht. Heutzutage werden solche Anwendungen immer häufiger auf webbasierte Technologien umgestellt.
quelle
Ich stimme zu, dass Qt ein guter Rahmen ist, mit dem man arbeiten kann. Dennoch gibt es eine Reihe von Problemen, die ich damit habe:
Ich liebe es, PyQt für Rapid Application Prototyping oder Inhouse-Anwendungen zu verwenden. Die Verwendung von Python für die gesamte Codierung lindert die Probleme mit C ++ und macht Qt zu einem sehr angenehmen Ort.
Bearbeiten Sie als Antwort auf einige Kommentare:
Als ich darüber schrieb, dass Qt in C ++ geschrieben wurde, habe ich mich nicht so sehr über Qt selbst beschwert, sondern über die Umgebung, in der es lebt. Es ist wahr, dass Qt seine eigenen Ressourcen sehr gut verwaltet, aber all Ihre GUI-bezogenen, aber not-Qt-Code muss auch in C ++ geschrieben werden. Auch dort bietet Qt viele nützliche Tools, aber letztendlich müssen Sie sich auf dieser Ebene mit C ++ befassen. Qt macht C ++ erträglich, aber es ist immer noch C ++.
Was die Selbstbeobachtung betrifft, meine ich Folgendes: Die schwierigsten Fehlerbehebungsfälle sind, wenn Sie einen Zeiger auf ein Objekt haben, das sich nicht so verhält, wie Sie es sich vorstellen. In C ++ kann Ihr Debugger möglicherweise ein wenig in dieses Objekt hineinsehen (wenn es an diesem Punkt zufällig Typinformationen enthält), aber selbst das funktioniert nicht immer. Nehmen Sie auf der anderen Seite Kakao in der gleichen Situation. In Cocoa / Obj-C können Sie Nachrichten ("Aufruffunktionen") direkt innerhalb des Debuggers an ein Objekt senden. Sie können den Objektstatus ändern, Sie können ihn nach seinen Attributen abfragen, Sie können ihn nach seinem Typ und seinen Funktionsnamen fragen ... Dies kann das Debuggen erheblich vereinfachen. Qt / C ++ hat nichts in der Nähe.
quelle
Ich mag Qt sehr, aber es ist ein bisschen schwergewichtig für viele Anwendungen. Manchmal braucht man einfach nicht so viel Komplexität. Manchmal braucht man nur etwas Einfaches ohne den ganzen Aufwand von Qt. Nicht jede Anwendung muss ereignisgesteuert sein, und C ++ bietet einen angemessenen Satz von Vorlagen. Boost bietet einen weiteren sehr guten Satz und enthält viele der Funktionen auf niedriger Ebene (Datei, Socket, verwaltete Zeiger usw.), die QT ausführt.
Für andere Anwendungen gelten Lizenzanforderungen, die mit der GPL, LGPL oder der kommerziellen Lizenz von Qt nicht kompatibel sind. Die GPL ist für kommerzielle Software ungeeignet. Die LGPL ist für statisch verknüpfte Software ungeeignet und die kommerzielle Lizenz kostet Geld - etwas, das viele nicht bezahlen wollen.
Einige haben Sicherheits- oder Stabilitätsaspekte, die komplexe Bibliotheken wie Qt nicht zulassen.
Sie müssen moc ausführen, um Ihre Quellen vorab zu verarbeiten. Das ist kein großes Problem, aber für den neuen Benutzer kann es entmutigend sein. Viele Programmierer denken Sie müssen mit Qt verwenden qmake, aber das ist eine falsche Bezeichnung. Es ist sehr einfach, Qt in andere Build-Systeme einzubinden.
Einige Ziele sind sehr speicher- oder CPU-eingeschränkt.
Es gibt einige plattformspezifische Fallstricke. Die meisten dieser Fallstricke sind nicht dokumentiert. Wenn Sie eine ausreichend große Anwendung erstellen, werden Sie darauf stoßen und sich fragen, was los ist.
Es ist nur C ++. Es gibt andere Sprachbindungen, aber sie verbergen häufig die Funktionen, für die Sie Qt benötigen, oder machen sie nur unzureichend verfügbar.
Es gibt viele Gründe, Qt nicht zu verwenden, deshalb gibt es Alternativen. Wenn Sie nur einen Hammer haben, wird jedes Problem wie ein Nagel aussehen.
quelle
Das Wichtigste, aber nicht Erwähnte. In großen Projekten verursacht eine Sache so viele Probleme und unnötigen Code. Die Signalschlitzmechanismen von Qt sind ineffizient. Qt-Widgets liefern keine erforderlichen Signale für einfache Ereignis-Widgets. Beispielsweise können Sie keine Signale für onHover, onMouseEnter, onMouseLeave, onKeyReleased, onLostFocus, onGainFocus usw. festlegen. Selbst das komplexeste Widget wie QTreeWidget bietet ein oder zwei extrem einfache, nutzlose Signale.
Ja, Sie können Ereignisse verwenden, ABER !!! Sie haben für jedes Widget mit benutzerdefiniertem Ereignis eine neue Klasse erstellt. Dies ist ein enormer Effizienzverlust.
Einer meiner Studenten hat für jedes Kombinationsfeld-Widget eine neue Kombinationsfeld-Klasse geschrieben, weil er ein Nicht-Signal-Ereignis verwenden musste. Wahre Geschichte...
Qt ist jedoch das beste C ++ - UI-Framework, das es bisher mit Höhen und Tiefen gibt.
quelle
Meiner Meinung nach ist es einfacher, C ++ - Programmierung zu lernen, als in andere Sprachen zu fallen, die ihre Komplexität verbergen, und der Programmierer weiß nicht, was wirklich im Hintergrund passiert. Qt hingegen bietet einige Vorteile gegenüber C ++ und ist damit höher als natives C ++. Somit ist Qt C ++ ein großartiges Framework für diejenigen, die auf die gleiche Art und Weise Aufgaben auf niedriger oder hoher Ebene entwickeln möchten. C ++ ist (nach einigen Methoden) eine komplexe und einfache Sprache. Komplex für diejenigen, die es nicht herausfordern wollen, einfach für diejenigen, die es mögen. Lassen Sie es nicht zu komplex!
quelle
Der eigentliche Grund ist nicht technisch.
Menschen sind zufällig anders. So sind ihre Entscheidungen. Homogenität ist kein menschliches Merkmal.
quelle