Kommentare
- ' ist natives C ++. Die meisten Entwickler würden höhere Sprachen wie C # bevorzugen.
- Das zweischneidige Schwert der Abwärtskompatibilität hat Qt viele Anachronismen, nicht behebbare Fehler und anderes schlechtes Verhalten hinterlassen.
- @ user16764 : " Die meisten "?
- Ich denke nicht ' Der TIOBE-Index ist ein wirklich genaues Maß, da er die Popularität misst und nicht verwendet. Ein Vergleich der Codemenge in Open Source-Repositorys wie GitHub, Bitbucket, Codeplex und Sourceforge würde genauere Messungen ergeben. (Und ich glaube, diese genaueren Messungen bringen C und C ++ an die Plätze 1 und 2 – Java hat einen unfairen Vorteil im TIOBE-Index, weil es ' für Studienanfänger verwendet wird und neue Programmierer machen mehr Aufsehen als erfahrene)
- @Giorgio: Ähm, Sie müssen in C # über solche Dinge nachdenken. Das Konzept von ", dem diese " gehört, geht weit über " hinaus, der
delete
". 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 einer höheren Sprache erzeugen, die ich ' auch gesehen habe.
Antwort
Ich beabsichtige nicht wirklich, dass dies eine verprügelnde Antwort ist, aber dies sind die Gründe, die ich tue Qt nicht persönlich verwenden. Es gibt viele gute Dinge zu sagen – nämlich, dass die API die meiste Zeit funktioniert und Plattformen nahtlos überbrückt. Aber ich verwende Qt nicht, weil:
- In einigen Fällen sieht es einfach nicht so aus, als würden native Programme aussehen. Das Entwerfen einer einzelnen Benutzeroberfläche für alle Plattformen wird aus verschiedenen Gründen des visuellen Stils von Maschine zu Maschine nicht richtig aussehen. Auf Mac-Computern sind beispielsweise geteilte Balken normalerweise relativ dick, und die Schaltflächen sind klein und mit Symbolen abgerundet. Auf Windows-Computern sind geteilte Balken normalerweise schmal und Schaltflächen sind textueller und quadratischer gestaltet. Nur weil Sie für jede Plattform eine Benutzeroberfläche schreiben können, bedeutet dies nicht, dass Sie dies für die meisten Anwendungen tun sollten.
- Qt ist nicht nur eine verknüpfbare Gruppe von C ++ – Bibliotheken. Das verwendete Build-System erfordert die Übersetzung bestimmter Dateien in zusätzliche Quelldateien, was den Build-Prozess im Vergleich zu den meisten anderen Bibliotheken erheblich kompliziert macht.
- Aufgrund von (2), C ++ – IDEs und Tools kann Qt-Ausdrücke als Fehler kennzeichnen, da sie die Besonderheiten von Qt nicht verstehen. Dies erzwingt fast die Verwendung von QtCreator oder eines Nur-Text-Editors wie
vim
. - Qt ist eine große Menge an Quellen, die auf jedem Computer vorhanden und vorinstalliert sein müssen, den Sie vor dem Kompilieren verwenden. Dies kann das Einrichten einer Build-Umgebung viel mühsamer machen.
- Teile werden meistens unter der LGPL lizenziert, die macht Es ist schwierig, die Einzel-Binär-Bereitstellung zu verwenden, wenn eine Freigabe unter einer restriktiveren oder weniger restriktiven Lizenz erforderlich ist.
- Im Vergleich zu ähnlich geschriebenen " normal ol „native Anwendungen " (außer natürlich, dass Anwendungen geschrieben werden zehn für KDE).
Kommentare
- @Dehumanizer: Es gibt ' die LGPL-Lizenz und ' ist die kommerzielle Lizenz. Die kommerzielle Lizenz beträgt Tausende von Dollar seitens des Lizenznehmers und erlaubt keine Weiterverteilung usw. Für Open Source-Projekte unter liberalen Lizenzen wie BSD, MIT oder Boost, bei denen die Autoren nicht '
- # 6 ist die größte Grund, warum ich es vermeide. Ich meine, ich möchte ' kein großes, klobiges Programm, und ich ' möchte nicht an eine bestimmte Lizenz gebunden sein, aber ' ist wirklich das Fehlen eines guten, nativen Erscheinungsbilds, das ' für mich ein Deal-Breaker ist.Neuere Versionen von OSX und Windows haben besonders gute Arbeit geleistet, um ihre nativen Schnittstellen hübsch, schnell und funktional zu gestalten, und ich ' würde lieber die ganze Arbeit nutzen, die sie ' habe ich bereits erledigt; Ich finde, dass sich viele Programme ohne nativen Look für mich billig und hackig anfühlen (nicht immer, aber es macht mich ein bisschen nervös).
- Ihre Nummer 6 hätte Nummer 1 sein sollen. Dies ist von weit das größte Problem mit Qt. In vielen Fällen werden die nativen APIs einfach nicht verwendet. Ich mag es, wenn meine Software nativ aussieht. Benutzer mögen das auch. Ich ' habe noch nie eine mit Qt erstellte Mac-Anwendung gesehen, die wie eine Mac-Anwendung aussah. Weder haben andere Mac-Benutzer, und sie ' sind in Bezug auf solche Dinge wählerisch. Sie verlieren den Vorteil, dass Sie " plattformübergreifend " sind, wenn Sie ' sind Verwenden Sie es nur zum Erstellen von Linux-Anwendungen. Dies ist ungefähr der einzige Ort, an dem es nativ aussieht, da es wirklich nichts natives gibt.
- außer dem Problem des ' native ' Look ist nicht mehr vorhanden. Die alte Konsistenz von Windows-Apps ist jetzt eine Bastardisierung aller einzigartigen Blobs, Glows und Animationen, die WPF und Silverlight Ihnen bieten. Schauen Sie sich das Control Panel von Office oder Windows 7 ' an, um zu sehen, wie selbst das Flaggschiffprodukt von MS heutzutage eine inkonsistente Benutzeroberfläche aufweist. Mac-Benutzer – nun, Sie haben dort einen sehr gültigen Punkt.
- @TrevorBoydSmith: Entschuldigung, aber Sie ' liegen falsch. Qt ist das einzige Framework, das Vorverarbeitung verwendet. Zeitraum. Überprüfen Sie GNOME, FLTK, WX und Freunde und zeigen Sie mir einen Vorverarbeitungsschritt. Sie haben ' keinen gefunden. Einige andere Bibliotheken verfügen über andere Build-Systeme, aber letztendlich handelt es sich um C ++ – Bibliotheken, die von jedem C ++ – Compiler erstellt werden können. " Raw win32 ist in meinen Gründen nicht vorhanden " ist in meinen Gründen als # 5 und # 6 vorhanden.
Antwort
Wie die Leute sagen, passt jedes Tool zu jedem Problem und jeder Situation …
Aber wenn Sie ein C ++ – Programmierer sind, ist Qt Ihr Framework. Kein Rivale.
Wir entwickeln eine komplexe kommerzielle Anwendung für die medizinische Bildgebung, und Qt hält daran fest.
Das sage ich nicht Die „Nachteile“, die die Leute darüber sagen, sind falsch, aber ich habe das Gefühl, dass sie Qt schon lange nicht mehr ausprobiert haben (es verbessert sich kontinuierlich bei jeder neuen Version …). Und meistens alle Probleme, die sie kommentieren sind kein Problem, wenn Sie vorsichtig sind.
Inkonsistenz der UI-Plattform: Nur wenn Sie die UI-Widgets „so wie sie sind“ ohne Anpassung oder benutzerdefinierte Grafik verwenden.
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 waren es auch mache es für eine lange Zeit. Ich glaube, ich habe eine gute Perspektive.
Wie gesagt, jedes Tool für jede Situation,
aber Qt ist ohne Zweifel ein konsistenter und nützlicher Rahmen.
Kommentare
- +1 Danke! Ich wollte nur das Gleiche schreiben. Der meiste Unsinn ist " nicht Open Source / kommerzielles Argument ". Erstaunlich, wie falsch viele Menschen den Begriff Open-Source verstehen. Qt war Open Source, seit ich es benutze (1.4). Früher hatte es die fairste Lizenz: Verdienen Sie Geld mit Qt – > pay.
- Oh, und ich habe wirklich keine ' t Achten Sie darauf, 10 MB DLLs zu Anwendungen hinzuzufügen, die 50 MB Kunst und 200 MB Video-Tutorials und Daten enthalten 🙂
- Der für Qt benötigte Speicherplatz ist heutzutage günstig.
- Dies entspricht ziemlich genau meiner Erfahrung mit Qt (das Widgets-Framework, ich habe ' QML / QtQuick bisher für nichts Ernstes verwendet). Es ist geeignet, große Anwendungen mit komplexen Anforderungen an die Benutzeroberfläche zu schreiben. Sobald Sie es gelernt haben, können Sie sehr produktiv sein. Die genannten Nachteile (separater Kompilierungsschritt zum Zuordnen, UI-Dateien usw.) sind kein Problem, wenn das Build-System ordnungsgemäß eingerichtet ist. Ich kann entweder qmake oder cmake empfehlen.
- Ab Qt 5.8 gibt es ein Projekt namens Qt Lite, das Qt für Ihre spezifischen Anforderungen extrem minimiert. Dies ist eine kommerzielle Funktion;)
Antwort
Von all den Dingen, die ich an Qt nicht mag, Die Tatsache, dass es mit Vorlagen nicht gut funktioniert, nervt mich am meisten. Sie können dies nicht tun:
template < typename T > struct templated_widget : QWidget { Q_OBJECT; public signals: void something_happened(T); };
Es funktioniert auch nicht gut mit dem Präprozessor. Sie können dies nicht tun:
#define CREATE_WIDGET(name,type) \ struct name ## _widget : QWidget \ { \ Q_OBJECT; \ \ public signals: \ void something_happened(type); \ }
Zusammen mit der Tatsache, dass alles, was auf ein Signal reagiert, ein Q_OBJECT sein muss, ist Qt schwer zu arbeiten für einen C ++ – Programmierer. Leute, die an Java- oder Python-Programmierung gewöhnt sind, sind wahrscheinlich tatsächlich besser.
Ich habe tatsächlich viel Zeit und Mühe darauf verwendet, einen Weg zu finden und zu entwickeln, um die Typensicherheit wiederherzustellen und ein Qt-Signal mit einem beliebigen Funktorobjekt zu verbinden: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html
Was ich dort tun möchte, ist eine grundlegende, alltägliche C ++ – Entwicklung, die vom Qt moc so gut wie unmöglich gemacht wird … was selbst ist Heutzutage völlig unnötig, wenn es jemals tatsächlich war.
Ehrlich gesagt, ich bleibe dabei, 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. ..was ist so 1980 (es ist scheiße, in dieser Scheiße wirklich hart zu arbeiten). Einige mögen WX sagen, aber es hat noch ernstere Probleme. GTKmm wäre meine erste Wahl gewesen, aber da es nur vom Eigentümer gezeichnet wird und keine Zugänglichkeit bietet, kann es nicht von branchenüblicher Testsoftware gesteuert werden. Qt ist in dieser Hinsicht schwer genug ( kaum em) > funktioniert, wenn Sie das Eingabehilfen-Plugin ändern.
Kommentare
- Was sehen Sie aus Interesse als die Hauptprobleme mit WX?
- @Tom – schlechte Dokumentation, insbesondere für die neuen Inhalte. Die AUI-Komponenten sind kaum dokumentiert, da große Abschnitte fehlen, was die Verwendung in einer Produktionsumgebung erschwert. Die Dokumentation für den Ereignisprozess ist grundsätzlich fehlerhaft in Bezug auf den Pfad, der verfolgt wird, zumindest auf win32. Ich habe viel Zeit damit verbracht, den Computer anzuschreien, " Dies sollte funktionieren !!! " bevor Sie sich mit dem Deep-Processing-Code befassen, um herauszufinden, dass WX nicht ' den Dokumenten folgt und was ich tat, NIEMALS funktionieren würde.
- Ich war auch durch die Aufnahme der Eigenschaftsgitterbibliothek in die Hauptleitung gestört. Ich habe diese Bibliothek verwendet und sie zeigte zahlreiche grundlegende Designfehler zusätzlich zu dem tatsächlichen Mangel an Wissen im Namen des Programmierers, der sie geschrieben hat (zum Beispiel virtuelle Funktionen in Konstruktoren genannt). Es und der schlechte Zustand der AUI zeigten einen Trend zu schlechteren Standards. Ich ' bin auch kein großer Fan von statischen Ereignistabellen, obwohl es zumindest ' eine andere Möglichkeit gibt, auf Ereignisse zu reagieren … Im Gegensatz zu MFC, bei dem WX einfach zu aufregend ist.
- Danke. Ich ' habe es nur ein bisschen benutzt und über die wxPython-API, wo es ganz nett schien. Ich kann verstehen, dass dies etwas von dem Bösen verbergen würde, aber auch, dass ich ' nicht tief genug involviert war, um auf die ernsteren Probleme zu stoßen. Ich muss mir dessen bewusst sein.
- Alles, was auf ein Signal reagiert, muss ein Q_OBJECT sein. Nein, heutzutage … Jetzt können statische Funktionen, Funktionen und sogar Lambda-Funktionen Antworten Sie auf ein Signal (Sie können Funktionszeiger als Slots verwenden). No-QObject-Klassen können auch Member-Slots haben, wenn Sie mit std :: bind eine Verbindung zu ihnen herstellen, um das Instanz Member in einen Funktionszeiger zu konvertieren.
Answer
Ein Grund, Qt nicht zu verwenden, besteht darin, dass Sie, wenn Sie nur für eine Architektur wie Windows schreiben, möglicherweise C # /. NET (oder Cocoa auf Mac) verwenden möchten, da dies ausnahmslos der Fall ist in der Lage sein, die neuesten Schnickschnack des Betriebssystems zu nutzen.
Wenn Sie plattformübergreifende Apps schreiben, sind Sie möglicherweise bereits stark an einer anderen Technologie wie Java interessiert (d. h. Sie arbeiten in einem „Java-Shop“). Ihre Wahl der Technologie kann durch das Ökosystem bestimmt werden, in dem Sie sich entwickeln, z. B. sprachspezifische APIs. In solchen Fällen kann es von Vorteil sein, die Anzahl der Technologien zu minimieren.
Ein dritter Grund, den ich mir vorstellen kann, ist, dass Qt auf C ++ basiert und C ++ eine vergleichsweise schwierig / gefährliche Programmiersprache ist Ich denke, es ist eine Sprache für Profis. Wenn Sie Spitzenleistung benötigen und akribisch sein können, ist C ++ wahrscheinlich immer noch das beste Spiel der Stadt. Tatsächlich verbessert Qt viele Probleme bei der Speicherverwaltung, wenn Sie Dinge so einrichten, dass sie nicht mehr in den Geltungsbereich fallen. Außerdem leistet Qt selbst gute Arbeit, um den Benutzer vor vielen unangenehmen C ++ – Problemen zu schützen. Jede Sprache und jedes Framework hat ihre Vor- und Nachteile. Es ist ein sehr, sehr kompliziertes Problem, das normalerweise durch den Zusatz zusammengefasst werden kann, der häufig bei Gästen auftritt: Geschwindigkeit, Qualität und Preis (aber Sie können nur zwei auswählen).
Obwohl die Regeln besagen, dass ich es behalten sollte Ich konzentriere mich auf die Beantwortung der Frage und möchte einige der von Billy ONeal aufgeworfenen Fragen widerlegen, der meiner Meinung nach gute Arbeit leistet und die häufig genannten Gründe für die Nichtverwendung von Qt zusammenfasst:
-
Qt ist in der Tat eine C ++ – Bibliothek / Framework / Header-Dateien. Es wird durch einen Makroprozessor (moc) erweitert , der unter anderem Signale und Slots ermöglicht. Es transformiert zusätzliche Makrobefehle (wie Q_OBJECT), sodass Klassen Introspektion und alle möglichen anderen Extras haben, die Sie als Hinzufügen von Objective-C-Funktionen zu C ++ betrachten könnten. Wenn Sie genug über C ++ wissen, um von diesem Mangel an Reinheit beleidigt zu werden, d.h.Sie sind ein Profi, dann 1) verwenden Sie Q_OBJECT und seine Art nicht oder 2) seien Sie dankbar dafür und programmieren Sie um die sehr begrenzten Eckfälle, in denen 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 zitierten Probleme wie schlechte Dokumentation, schreckliche API und plattformübergreifende Horror (denken Sie an alte Compiler wie gcc 3.3 und große Eisen-Compiler wie AIX).
-
Für die Editorunterstützung folgt dies auch aus 1, da stimme ich etwas zu. Tatsächlich ist Qt Creator meiner Meinung nach der beste grafische C ++ – Editor, Punkt , auch wenn Sie das Qt-Zeug nicht verwenden. Viele professionelle Programmierer verwenden Emacs und Vim. Ich denke auch, dass Eclipse die zusätzliche Syntax übernimmt. Somit gibt es keine Probleme mit den Qt-Makros (Q_OBJECT) oder den Hinzufügungen von Signalen / Slots. Sie werden diese Makros wahrscheinlich nicht in Visual Studio finden, da sie (ich gebe zu) Ergänzungen zu C ++ sind. Aber im Großen und Ganzen werden C # /. NET-Leute Qt sowieso nicht verwenden, da sie einen Großteil der Funktionen mit ihren eigenen proprietären Techniken abdecken.
-
Was die Größe der Qt-Quelle betrifft, solange sie über Nacht kompiliert wird, wen interessiert das? Ich habe Qt 4 auf meinem Dual-Core-Macbook in „weniger als über Nacht“ kompiliert. Ich hoffe, dass dies nicht der Grund für Ihre Entscheidung ist Verwenden oder Verwenden einer bestimmten Technologie. Wenn dies wirklich ein Problem ist, können Sie die vorkompilierten SDKs für Mac, Linux und Windows von der Qt-Website herunterladen.
-
Lizenzierung ist Verfügbar in drei Auswahlmöglichkeiten: 1) Proprietäre Lizenz für den Fall, dass Sie Qt ITSELF ändern und nicht teilen oder die Tatsache verbergen möchten, dass man Qt verwendet und nicht bereit ist, eine Zuordnung vorzunehmen (könnte für das Branding sehr wichtig sein und Bild!) 2) GPL und 3) LGPL. Ja, es gibt Probleme mit der statischen Verknüpfung (das gesamte Qt wird in die Binärdatei gerollt) – aber ich denke, das ist mehr, weil man nicht hineinschauen und bemerken kann, dass Sie es sind u sing Qt (Zuschreibung!). Ich habe versucht, eine proprietäre Lizenz von Digia zu kaufen, und sie sagten mir: „Für das, was Sie tun, brauchen Sie es wirklich nicht.“ Wow. Von einem Unternehmen, das Lizenzen verkauft.
-
Die Größe der Binärdatei / des Bundles ist darauf zurückzuführen, dass Sie das Qt-Material 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 beim Verteilen der statischen Datei mit ~ 50 Megabyte gefunden (die ich mit einigen der Dienstprogramme für binäre Stripper / Komprimierung wie UPX noch kleiner machen kann). Ich tue es einfach nicht Dies ist wichtig genug, aber wenn Bandbreite jemals ein Problem wäre, würde ich meinem Build-Skript einen UPX-Schritt hinzufügen.
-
Was definiert „Native Look and Feel“? 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. Sie sehen sich nicht ähnlich, 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 denken könnte.
Kommentare
- Was ich ' nicht bekomme, ist, warum diese plattformübergreifenden Bibliotheken ' nicht einfach Wrapper-Funktionen sind oder noch besser; Wenn Defs in Bezug auf Cocoa-, Win32-, KDE / Gnome-Funktionen vorhanden sind, wird die bestaussehende Benutzeroberfläche mit allen ' -Funktionen sichergestellt.
- @MarcusJ Schreiben eines Wrappers Ein Toolkit ist eindeutig nicht trivial, egal 4 oder mehr – aber wenn Sie denken, dass ' so einfach ist, sind Sie ' willkommen versuchen. Was die Idee betrifft, dass dies nur mit bedingter Vorverarbeitung erreicht werden könnte … müssen Sie scherzen, richtig?
- @MarcusJ libui ist genau das (allerdings ohne KDE-Unterstützung).
- Ich möchte hinzufügen, dass Sie jetzt Qt / QML mit .NET verwenden können. Sie müssen ' C ++ nicht berühren. github.com/qmlnet/qmlnet PS: Ich ' bin der Autor.
Antwort
Ein Teil davon ist lizenziert. Unter https://en.wikipedia.org/wiki/Qt_(software) #Licensing finden Sie einige Informationen zum Lizenzverlauf. Bis zum Jahr 2000 verwendeten 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 Personen, 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 nicht die Möglichkeit, Qt zu verwenden. Daher konnte jedes freie Softwareprojekt, das älter als diese Daten ist, Qt nicht verwenden. Und natürlich mussten Leute, die proprietären Code schreiben, für das Privileg bezahlen.
Außerdem ist es nicht so, als gäbe es ein Mangel an anderen Optionen. Zum Beispiel WxWidgets , GTK + und Tk sind alle plattformübergreifenden Open-Source-Toolkits.
Außerdem war Windows lange Zeit auf dem Desktop so dominant, dass viele Software nur zum Ausführen von Inhalten verwendet wurden Wenn Sie die Microsoft-Toolchain installieren, ist es einfacher, nur Microsoft-proprietäre Inhalte zu verwenden, als sich um irgendetwas anderes zu kümmern, und viele Programmierer haben genau das getan.
Kommentare
- @btilly: GTK + ist plattformübergreifend. Zum Beispiel ist der Pidgin IM-Client auf GTK + geschrieben.
- Ok, es ist jedoch möglich, dass ' irgendwie ' um unter Windows ausgeführt zu werden 🙂
- Installieren Sie GIMP einfach unter Windows und schauen Sie es sich an.
- Ja, und GIMP funktioniert gut unter Windows, aber es funktioniert sicherlich nicht ' passt nicht in die Windows 7-Benutzeroberfläche &.
- Pidgin ist wahrscheinlich ein besseres Beispiel für GTK unter Windows. ' macht nichts Besonderes, aber es passt und hat vielleicht 10 Jahre oder länger?
Antwort
Ich stimme fast allen oben diskutierten Gründen zu, aber viele Leute hier haben gesagt, dass sie Qt wegen des zusätzlichen Overheads, den es mit sich bringt, nicht verwenden würden. Ich bin anderer Meinung Dies liegt daran, dass 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 das wieder wettmacht zusätzliche Ressourcen, die es verwendet. Ich bin auf einige Konsolenanwendungen gestoßen, die in Qt und nicht in Standard-C ++ geschrieben wurden, da sie einfach geschrieben werden können.
Ich würde sagen, dass die Produktivität von Qt höher ist als die von C / C ++, aber geringer als die von Sprachen wie Python.
Kommentare
- Ich denke, es ist ' alles relativ zur individuellen ' Erfahrung, da ich in C ++ 14 OK codieren kann. Aber jedes Mal, wenn ich auf einen Qt-Code schaue, muss ich hart schielen, um ihn als dieselbe Sprache zu erkennen. Ich glaube also nicht, dass ' es ' ist der einstimmige Produktivitätssteigerer, den Sie ' hier implizieren.
- @underscore_d offensichtlich, wenn Sie C ++ sehr gut kennen und keine ' t Qt, mit letzterem werden Sie nicht produktiver. Wenn Sie jedoch sowohl C ++ als auch Qt kennenlernen, macht das Framework viele Dinge einfacher und schneller zu implementieren (C ++ 11, 14 usw. füllen die Lücke, aber noch nicht vollständig).
Antwort
Dies ist wirklich kein Versuch, einen Flammenkrieg zu beginnen, ich wollte nur einige der Punkte ansprechen.
Wahrscheinlich ist der wahre Grund dafür, dass Qt nicht häufiger verwendet wird, dass es C ++ ist und weniger Leute C ++ für Desktop-Apps verwenden.
Qt ist keine C ++ – Bibliothek. Es ist ein separater Kompilierungsschritt erforderlich, was den Erstellungsprozess im Vergleich zu den meisten anderen Bibliotheken erheblich kompliziert macht.
Die vs-addin für Visual Studio erledigt dies automatisch, ebenso wie Qts eigener Befehlszeilen-Erstellungsprozess. Der Ressourcen-Compiler, der zum Erstellen der Dialoge für MFC verwendet wird, ist ebenfalls ein separater Schritt, aber das ist immer noch c ++.
Qt ist eine große Menge an Quelle, die muss auf jedem Computer vorhanden und vorinstalliert sein, den Sie vor dem Kompilieren verwenden. Dies kann das Einrichten einer Build-Umgebung erheblich mühsamer machen.
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 SDK-Quellgröße heutzutage so wichtig ist. Visual Studio installiert jetzt alle C ++ – Bibliotheken, anstatt Sie auswählen zu müssen. Daher beträgt die Installationsgröße des Compilers> 1 GB.
It “ s ist nur unter LGPL verfügbar, was die Verwendung der Single-Binary-Bereitstellung schwierig macht, wenn eine Freigabe unter einer restriktiveren oder weniger restriktiven Lizenz erforderlich ist.
Die LGPL gilt nur für die Bibliothek, sie hat keinen Einfluss auf Ihren Code. Ja, es bedeutet, dass Sie DLLs anstatt einer einzelnen Binärdatei versenden müssen (es sei denn, Sie zahlen), aber in einer Welt, in der Sie eine Java-Laufzeit oder ein .Net-Update für einen winzigen Dienst herunterladen müssen, ist dies keine so große Sache „ist auch auf Plattformen mit einem einzelnen ABI weniger problematisch, sodass andere Qt-Apps die Bibliotheken gemeinsam nutzen können.
In einigen Fällen ist dies einfach nicht der Fall.“ Es sieht nicht so aus, als würden native Programme aussehen.Das Entwerfen einer einzelnen Benutzeroberfläche für alle Plattformen wird aus verschiedenen Gründen des visuellen Stils von Maschine zu Maschine nicht richtig aussehen.
Es wird angenommen Ich muss zugeben, dass ich hauptsächlich technische Apps verwende, damit meine Benutzer sich nicht zu sehr um den Stil kümmern. Besonders unter Windows bedeutet die neue Mode, alles als Smartphone-Widget zu gestalten, dass es sowieso immer weniger Standards gibt.
Kommentare
- Viele große Softwareunternehmen erstellen kommerzielle Anwendungen in C ++, aber mir ' sind nicht sehr viele bekannt, die QT verwenden. Obwohl ich verstehe, dass Nicht-C ++ – Entwickler QT vermeiden könnten, gibt es andere Gründe, QT zu vermeiden, selbst wenn Sie eine C ++ – App schreiben. Tatsächlich gibt es ' keine plattformübergreifende Sprache und kein GUI-Toolkit, an dem ich ' keinen Fehler finden kann. Es scheint, dass plattformübergreifende Entwicklung NUR EINFACH SCHWER ist und dass es nie einfach oder kostenlos ist, es gut zu machen, und dass das Versprechen, das QT macht (Schreiben Sie Ihre GUI einmal und verwenden Sie diese GUI überall wieder), nicht ' t genug.
- Die meisten Desktop-C ++ – Programme befinden sich entweder in MFC, weil sie vor 20 Jahren gestartet wurden, oder verwenden ein internes Toolkit, das vor 20 Jahren gestartet wurde, um MFC zu vermeiden (z. B. MS-Office oder Autocad). Ich bezweifle, dass mit WPF sehr viel in C ++ / CLR geschrieben wird. Aber auch ohne plattformübergreifende Überlegungen finde ich Qt das beste (oder am wenigsten schlechteste!) Desktop-Toolkit. Wie die meisten Leute bewegen wir uns in Richtung eines Webby-Frontends (möglicherweise in QtQuick / QML) und eines C ++ – Server-Backends – das wahrscheinlich Qt-Signale / Slots verwenden wird, aber keine GUI
- Ich stimme zu. Am wenigsten schlimm. Und selbst bei Nur-Windows-Apps habe ich ' lieber QT-Probleme als MFC-Probleme behoben.
- @WarrenP – ja, ich habe ' Verpassen Sie nicht die Suche im Codeprojekt nach all dem, was in MFC fehlt. Aber mit der neuen Liebe von MSFT ' zum nativen Code haben sie ' nicht viel getan, um das Schreiben einer GUI einfacher zu machen.
Antwort
Der Grund ist einfach: Es hat keine guten Bindungen zu allen gängigen Sprachen und es ist nicht magisch immer für den jeweiligen Job geeignet.
Verwenden Sie das richtige Werkzeug für den Job. Wenn ich eine einfache Befehlszeilenanwendung schreibe, warum sollte ich das dann nur mit Qt aufblähen?
Als allgemeinere Antwort (die ich geben kann, weil ich hier relevant bin ), einige Programmierer haben 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.
Kommentare
- Aber Qt bietet Fähigkeit, nur Konsolenanwendungen zu schreiben. Ist es nicht '?
- @Dehumanizer: Ich habe keine Ahnung. Aber warum sollte ich es für ein kleines Hilfsprogramm verwenden? Welchen Nutzen würde mir das bringen, wenn ich die Anwendung trivial nur in Standard-C ++ schreiben kann? Anscheinend suchen Sie ' nach einem Grund für die Verwendung einer Bibliothek , was eine rückwärts gerichtete Methode zum Programmieren darstellt.
- @Dehumanizer: As Ich sagte, dass ' ein Rückwärtsansatz ist. Wenn Sie eine Bibliothek benötigen, wissen Sie ', und dann können Sie einige ausprobieren und herausfinden, was besser zu Ihren Anforderungen passt. Der Versuch, eine Meinung zu einer Bibliothek zu sammeln, wenn Sie ' keinen Anwendungsfall haben , ist ein Dummkopf ' Besorgung.
- " Wenn ich ' eine einfache Befehlszeilenanwendung schreibe, warum sollte ich das aufblähen? mit Qt nur um der Sache willen " gibt es mindestens ein sehr berühmtes Nicht-GUI-Tool, das in Qt geschrieben ist – Doxygen 🙂
- @Dehumanizer zum Beispiel Wenn Sie sich mit Dateien, XML, Unicode, JSON, Regexp, Concurency, Datenbanken usw. usw. sehr schnell befassen müssen und ' kein drittes Drittel herunterladen, übernehmen, pflegen möchten Parteibibliotheken.
Antwort
Frameworks wie Qt sind geeignet, wenn Sie sich mehr mit Ihrem Produkt beschäftigen auf allen Plattformen gleich als wenn Ihr Produkt auf allen Plattformen richtig aussieht. Heutzutage werden solche Anwendungen immer häufiger auf webbasierte Technologien umgestellt.
Antwort
Meiner Meinung nach ist das Erlernen der C ++ – Programmierung einfacher, als in andere Sprachen zu fallen, die ihre Komplexität verbergen, und der Programmierer weiß nicht, was passiert wirklich im Hintergrund. Qt hingegen bietet einige Vorteile gegenüber C ++, um es höher als natives C ++ zu machen. Somit ist Qt C ++ ein großartiges Framework für diejenigen, die Aufgaben auf niedriger oder hoher Ebene auf dieselbe Weise entwickeln möchten. C ++ ist (nach einigen Methoden) eine komplexe und einfache Sprache. Komplex für diejenigen, die nicht damit herausfordern wollen, einfach für jemanden, der es mag.Überlassen Sie es nicht der Komplexität!
Antwort
Ich stimme zu, dass Qt ein guter Rahmen für die Arbeit ist. Trotzdem gibt es eine Reihe von Problemen, die ich damit habe:
- Es ist in C ++ geschrieben, einer wirklich einfachen Sprache. Allein die Tatsache, dass es sich um C ++ handelt, macht jeden Qt-Programmierer im Vergleich zu in anderen Sprachen geschriebenen Frameworks deutlich weniger produktiv. Mein Hauptproblem bei C ++ als GUI-Entwicklungssprache ist, dass es so gut wie keine Vorstellung von automatischer Speicherverwaltung gibt, was den Entwicklungsprozess viel fehleranfälliger macht. Es ist nicht introspektiv, was das Debuggen viel schwieriger macht. Die meisten anderen wichtigen GUI-Toolkits haben eine Vorstellung von automatischer Speicherverwaltung und Selbstbeobachtung.
- Jedes plattformübergreifende Toolkit hat das Problem, dass es immer nur den kleinsten gemeinsamen Nenner aller unterstützten Plattformen implementieren kann. Dies und verschiedene UI-Richtlinien auf verschiedenen Plattformen stellen die Wünschbarkeit plattformübergreifender GUIs insgesamt in Frage.
- Qt konzentriert sich sehr darauf, Ihre gesamte UI zu codieren. Obwohl Sie mit QtDesigner einige Teile Ihrer Benutzeroberfläche erstellen können, fehlt es im Vergleich zu (Cocoa / Obj-C) Interface Builder oder den .Net-Tools.
- Obwohl Qt viele Anwendungsfunktionen auf niedriger Ebene enthält, kann es nicht mit einem für eine bestimmte Plattform von Hand zugeschnittenen Framework verglichen werden. Die nativen Betriebssystembibliotheken für Windows und OSX sind wesentlich leistungsfähiger als die Implementierungen von Qt. (Denken Sie an Audio-Frameworks, Zugriff auf Dateisysteme auf niedriger Ebene usw.)
Trotzdem liebe ich die Verwendung PyQt für Rapid Application Prototyping oder Inhouse-Anwendungen. Die Verwendung von Python für die gesamte Codierung verringert die Probleme mit C ++ und macht Qt zu einem sehr angenehmen Ort.
Bearbeiten, als Antwort auf einige Kommentare:
Als ich über Qt in C ++ schrieb, beschwerte ich mich nicht so sehr über Qt selbst , aber mehr über die Umgebung, in der es lebt. Es ist wahr, dass Qt seine eigenen Ressourcen sehr gut verwaltet, aber all Ihr GUI-bezogener, aber nicht Qt-Code muss auch in C ++ geschrieben werden. Selbst dort bietet Qt viele nette Tools, aber letztendlich muss man sich auf dieser Ebene mit C ++ auseinandersetzen. Qt macht C ++ erträglich, aber es ist immer noch C ++.
Was Introspektion betrifft, meine ich Folgendes: Die am schwierigsten zu debuggenden Fälle sind wenn du Haben Sie einen Zeiger auf ein Objekt, das sich nicht so verhält, wie Sie es sich vorstellen. Mit C ++ kann Ihr Debugger möglicherweise ein wenig in dieses Objekt hineinschauen (wenn es zu diesem Zeitpunkt Typinformationen gibt), aber selbst das funktioniert nicht immer. Nehmen Sie andererseits Kakao in der gleichen Situation. In Cocoa / Obj-C können Sie Nachrichten („Aufruffunktionen“) an ein Objekt direkt im Debugger 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 wesentlich komfortabler machen. Qt / C ++ hat nichts in der Nähe.
Kommentare
- 1. Wenn Sie sich selbst um die Speicherverwaltung kümmern, müssen Sie ' delete ' nach jedem ' new '. 1a. C ++ ist KEINE Low-Level-Sprache, sondern eine High-Level-Sprache mit ' Fähigkeiten '. 3. Ich stimme zu, aber Qt bietet an, gleichzeitig eine Benutzeroberfläche mit QtDesigner und mit ' einfachem Code ' zu erstellen. 4. Stimmen Sie erneut zu, aber Qt bietet auch die Verwendung nativer APIs an.
- zu Ihrem Punkt Nr. 1. Ich denke, C ++ verfügt über eine Art halbautomatische Speicherverwaltung: Wenn Sie intelligente Zeiger wie std :: auto_ptr verwenden oder boost :: shared_ptr usw. Sie müssen sich im Allgemeinen nicht um die Freigabe von Speicher kümmern. Diese Art von Containern kann auch für andere Ressourcen erstellt werden (Dateien, Systemressourcen, die freigegeben werden müssen). Die Verwendung von RAII-Mustern hilft sehr bei der Speicherverwaltung, und wenn es in Sie hineinwächst, müssen Sie sich nicht wirklich um das Gedächtnis kümmern.
- " Die Tatsache allein, dass C ++ macht jeden Qt-Programmierer im Vergleich zu in anderen Sprachen geschriebenen Frameworks deutlich weniger produktiv. " [Zitieren erforderlich]
- @ SK-Logik: Während ich denke Ich verstehe alle Wörter in Ihrem dritten Satz, ich habe keine Ahnung, was Sie sagen. Was ist eine " Abstraktionsebene "? In diesem Fall ist Ihr erster Satz angesichts der Wikipedia-Definition von " Low-Level-Sprache " falsch.
- @ SK-Logik: Die Metaprogrammierung von Vorlagen ist vollständig, und es gibt Leute, die klug und kompetent genug sind, um davon zu profitieren. RAII ist ' keine großartige Speicherbereinigung, aber die Tatsache, dass es für alle Arten von Ressourcen funktioniert, macht dies mehr oder weniger wieder wett.Welche Art von Abstraktion funktioniert nun speziell in Java, aber nicht in C ++?
Antwort
Das wichtigste aber nicht erwähnte Sache. Bei großen Projekten verursacht eine Sache so viele Probleme und nicht notwendigen Code. Die Signalsteckplatzmechanismen von Qt sind ineffizient. Qt-Widgets liefern keine erforderlichen Signale für ereigniseinfache Widgets. Beispielsweise können Sie keine Signale für onHover, onMouseEnter, onMouseLeave, onKeyReleased, onLostFocus, onGainFocus usw. festlegen. Selbst das komplexeste Widget wie z QTreeWidget liefert 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;
- Sie haben jedes angepasste Widget-Objektereignis neu geschrieben. Es gibt kleine Änderungen.
- Sie verlieren alle Qt Designer-Inhalte. Sie müssen jedes Widget mit benutzerdefinierten Ereignissen bewerben.
- Das Projekt wurde größer und schwer zu warten.
- Sie haben qt aus diesem Grund nicht mehr gemocht. Und Sie haben angefangen darüber zu sprechen, wie .net Delegierte bereitstellt, wie es viel, viel besser ist als Signal-Slot, wie .net Komponenten (Widgets) bieten im Allgemeinen jedes Ereignis, das Sie sich vorstellen können. Und so weiter.
Eines meiner Colleges hat für jedes Kombinationsfeld-Widget eine neue Combo-Box-Klasse erstellt, da er ein Nicht-Signal-Ereignis verwenden musste. Wahre Begebenheit …
Qt ist jedoch das bisher beste C ++ – UI-Framework mit Höhen und Tiefen.
Kommentare
- In Bezug auf Ereignisse und das Erstellen neuer Klassen: Sie können Ereignisfilter in Klassen verwenden, die darauf reagieren müssen.
- " Ja, Sie können Ereignisse verwenden, ABER !! ! Sie haben für jedes Widget eine neue Klasse mit einem benutzerdefinierten Ereignis erstellt. Dies ist ein enormer Effizienzverlust; " – NICHT GENAU. Am Ende habe ich nur bool eventFilter, das mehrere Widgets verarbeitet, und installiere dann EventFilter (this) auf allen untergeordneten Widgets. Und dies ist kein ' Verlust an Effizienz und Programmierleistung! Eigentlich verwende ich nie " Aufgestufte Widgets " … Ich lasse einfach ein leeres Widget fallen, installiere es als eventFilter darauf und implementiere die meisten neu meine Ereignisse in meiner Haupt-CPP-Klasse. Probieren Sie es aus, ' hat keine Schmerzen 🙂 Sie können fast ALLES in Qt anpassen, ohne jedes Mal neue Klassen zu erstellen.
Antwort
Ich mag Qt wirklich, aber es ist für viele Anwendungen ein bisschen schwergewichtig. Manchmal braucht man diese Komplexität einfach nicht. Manchmal braucht man einfach etwas Einfaches ohne den ganzen Aufwand von Qt. Nicht jede Anwendung muss ereignisgesteuert sein, und C ++ bietet einen angemessenen Satz von Vorlagen. Boost bietet ein weiteres sehr gutes Set und enthält viele der Low-Level-Funktionen (Datei, Socket, verwaltete Zeiger usw.), die QT bietet.
Andere Anwendungen haben Lizenzanforderungen, die mit GPL nicht gut funktionieren , LGPL oder Qts kommerzielle Lizenz. 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 möchten.
Einige haben Sicherheits- oder Stabilitätsaspekte, die komplexe Bibliotheken wie Qt nicht zulassen.
Sie müssen moc ausführen, um Ihre Quellen vorzuverarbeiten. Dies ist kein großes Problem, kann jedoch für den neuen Benutzer entmutigend sein. Viele Programmierer denken, dass Sie benötigen , um qmake mit Qt zu verwenden, aber das ist eine Fehlbezeichnung. Es ist möglich, Qt ziemlich einfach in andere Build-Systeme zu integrieren.
Einige Ziele sind sehr Speicher oder CPU eingeschränkt.
Es gibt einige plattformspezifische Fallstricke. Die meisten dieser Fallstricke sind nicht dokumentiert. Erstellen Sie eine ausreichend große Anwendung, und Sie werden auf sie stoßen und sich fragen, was los ist (Haftungsausschluss, die Das letzte Mal, dass ich Qt in Wut verwendet habe, war vor über 18 Monaten, daher hat es sich möglicherweise verbessert.
Es ist nur C ++. Andere Sprachbindungen existieren, aber sie neigen dazu, einen Großteil der zu verbergen oder schlecht freizulegen Funktionalität, für die Sie Qt möchten.
Es gibt viele Gründe, Qt nicht zu verwenden. Deshalb gibt es Alternativen. Wenn Sie nur einen Hammer haben, sieht jedes Problem wie ein Nagel aus.
Kommentare
- " Die LGPL ist für statisch verknüpfte [Closed Source] -Software " ungeeignet – dies scheint ungenau zu sein, da LGPL und statische Verknüpfung tatsächlich rechtlich möglich sind ( siehe ).
- Ihre Position erscheint korrekt. Siehe gnu.org/licenses/gpl-faq.html#LGPLStaticVsDynamic Aber ' ist zusätzliche Arbeit und zusätzliche Dinge versenden. Kannst du damit durchkommen? Ja. Möchten Sie die Mühe aufwenden? Möglicherweise nicht.
Antwort
Der eigentliche Grund ist nicht technisch.
Menschen passieren anders sein. So sind ihre Entscheidungen. Einheitlichkeit ist kein menschliches Merkmal.
Kommentare
- Gehen deshalb alle Menschen auf ihren Beinen? Nun, diejenigen, die mindestens Beine haben …