QLineEdit und anderes

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
the_real_noob
User
Beiträge: 20
Registriert: Donnerstag 26. Januar 2017, 09:57

@BlackJack

Hab erst einmal Dank für Deine ausführliche Antwort. Ich habe das Gefühl, mitten in ein Wespennest gestochen zu haben bzw. in einen philosophischen Diskurs geraten zu sein, wie man Software entwickelt. Hierbei scheinst Du und das meine ich Deinen Ausführungen entnehmen zu können, ein Befürworter des unkonventionellen Weges zu sein - hierfür spricht u. a. Deine Vorliebe für Python und Deine 'Ablehnung' von Java.

Selbstverständlich hast Du damit recht, wenn Du ausführst, dass man erst einmal die Software entwerfen sollte, bevor man ein bestimmtes Muster implementiert. Hier kommt der Grund ins Spiel, warum ich mich mit dem MVC beschäftige. Ich habe eine Idee für eine Anwendung und möchte diese auf verschiedenen Plattformen implementieren und dazu eine Webanwendung zur Verfügung stellen, über welche auf die volle Funktionalität der Anwendung zugegriffen werden kann.

Um das zu konkretisieren. Ein User hier im Forum hat irgendwo geschrieben, dass es in der Zukunft nur noch webbasierte Anwendungen geben wird. Ich habe daran so meine Zweifel. Allein der Ausfall der Amazon-Server vor ein paar Tagen, ist ein Grund. Aber auch die ständigen Ausfälle bei den Providern oder die immer noch sehr langsamen Verbindungen auf dem Land und insbesondere in unerschlossenen Regionen, sind m.M.n. Grund genug dafür, den Usern eine webunabhängige Anwendung zur Verfügung zu stellen, die zumindest in ihren grundsätzlichen Funktionen auch dann voll einsatzfähig ist, wenn es keine oder nur eine schlechte Internetverbindung gibt oder diese sehr teuer ist.

Somit sind schon einmal mindestens zwei verschiedene GUIs zu implementieren. Eine für das Web, eine für die Plattformen. Und dabei gibt es viele Ansichten für die unterschiedlichen Funktionalitäten.

Und rein aus Gründen der Übersicht finde ich deswegen das MVC interessant und wollte bzw. will mich mit dem oben geposteten Beispiel damit vertraut machen. Ob das nun besonders geglückt ist, sei einmal dahingestellt.

Was die Verwendung von Frameworks und Bibliotheken angeht, bin ich ein gebranntes Kind. Da kann man sich nämlich herzlich die Zähne dran ausbeißen. Entweder die angebotenen Module tun oft nicht genau das, was man will und man ist zu so großen Anpassungsarbeiten gezwungen, dass man am besten gleich selbst ein Modul erstellt oder aber, sie zwingen einem ihr eigenes Designparadigma auf.

Für letzteres ist Qt ein Beispiel. Ich will eine QEditLine mit einer Auto-Vervollständigung ausstatten. Qt bietet dafür unter anderem das Modul Completer an. Das tut aber nicht genau das, was ich will. Ich will, dass der User, wenn er seinen Wohnort eingibt, nach drei Buchstaben die Orte vorgeschlagen bekommt, die mit hoher Wahrscheinlichkeit sein Wohnort sein können. Also, wenn er 'Ber' eingibt, dann sollte als erster Vorschlag Berlin kommen und nicht Beratzhausen, Berching, Berchtesgaden. Um das umzusetzen, muss ich mir etwas eigenes basteln. Funktioniert einfach nicht so, wie ich das will. Gut, dass ist eine Aufgabe für irgendwann einmal, aber da hapert es dann nämlich sehr schnell.

Auch erfordern viele dieser Bibliotheken eine erhebliche Einarbeitungszeit und weil man so viel Zeit dafür aufgewandt hat, fixiert man sich auf diese Bibliotheken, was m.M.n. den Entwickler wieder einschränkt.

Was mich zudem bewogen hat, mich mit dem MVC zu beschäftigen, ist, dass es immer wieder einmal zu Designwechseln kommt. Sieh Dir YouTube an. Da kommt es immer wieder zu Designwechseln bzw. das Design unterscheidet sich z. B. in den USA und Deutschland. Tatsächlich fängt das schon bei der Farbwahl an, die in unterschiedlichen Kulturen unterschiedliche Bedeutungen haben. Will man seine Anwendung darauf abstimmen, ohne auch ständig mit der Funktionalität in Berührung zu kommen, was bleibt einem da für eine Wahl?

Natürlich hast Du auch in dem Punkt recht, dass man sich am besten erst einmal mit den Grundlagen einer Programmiersprache auseinandersetzen sollte, aber das ist m.M.n. genauso wie mit dem erlernen einer natürlichen Sprache. Man will sie doch nicht erst sprechen, wenn man ein umfassendes Verständnis für sie erlangt hat, sondern fängt an zu radebrechen. Hauptsache, man kann sich irgendwie verständlich machen. Und genauso ist das beim Coden. Es ist zu Anfang doch gar nicht so entscheidend, ob man schönen, sauberen Code schreibt, möglichst kurz und effektiv. Am Anfang ist es entscheidend, dass das Ding funktioniert.

Zu Deinem Zitat von Saint-Exupéry. Ist das der Grund, warum die VIPs aus Film, Fernsehen, Musik bei ihren öffentlichen Auftritten immer weniger anhaben? Zumindest die weiblichen. :D
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@the_real_noob: ich glaube Du hast eine falsche Vorstellung von Frameworks allgemein und von Qt im Speziellen. Frameworks sollen Dir helfen, komplexe Dinge so einfach zu erledigen, wie das eben bei z.B. einer Oberfläche möglich ist. Eine Autovervollständigung ist von ihrer Interaktion mit dem Nutzer komplex (Tastatur-, Mauseingaben, Listendarstellung, etc.) Darauf abstrahiert Qt mit einem Completer, der einen bestimmten Anwendungsfall recht gut abdeckt, andere durch das Überschreiben weniger Methoden aber auch erlaubt. Bei komplexen Problemen gibt es zudem nicht die eine Lösung, sondern verschiedene Ansätze, die sich irgendwo zwischen »ich gebe vieles fest vor, so dass die Benutzung einfach wird«, bis »ich muß viel lernen und viel selbst machen, dafür habe ich auch die Flexibilität« reichen. Es gibt fertige Widgets, wo die Anwendung sehr einfach ist, aber sobald es kein passendes gibt, merkst Du erst, wieviel Arbeit in einem fertigen Widget steckt, weil man dann alles selbst tun muß.
the_real_noob
User
Beiträge: 20
Registriert: Donnerstag 26. Januar 2017, 09:57

@Sirius3

Ich lehne Frameworks ja nicht komplett ab und arbeite zur Zeit auch mit Qt. Ich werde mir auch SQLAlchemy ansehen.
Ich bin eben nur skeptisch. Bei Qt gehe ich davon aus, dass dahinter eine sehr gut strukturierte Bibliothek liegt, weil dahinter eben mal Nokia stand, das als Unternehmen anders strukturiert als Open Source-Produkte. Aber es erschlägt einen auch mit seiner Komplexität und braucht eine Menge Know How, um es richtig anzuwenden. Bei Open Source-Bibliotheken wächst meine Skepsis um ein vielfaches, denn es gilt der Satz: Zu viele Köche verderben den Brei!

Soll nicht heißen, dass ich Open Source-Produkte prinzipiell ablehne.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Nokia hat an Qt nicht viel mitstrukturiert, ausser der Vorgabe zur Entwicklung von QML. Qt wird seit ~25 Jahren von einem relativ festen Entwicklerteam vorangetrieben, welches früher mal als Trolltech firmierte, dann über Nokia an Digia weitergereicht wurde. Problem mit Qt ist seit langem die Monetarisierung. Die Entwickler haben zwar ein schönes Stück Software für C++ geschaffen (C++-Puristen und Mockhasser bitte überlesen), leider lässt es sich nicht so richtig an den Mann bringen. Mit Digia bzw. der Ausgründung unternehmen sie den 5. oder 6. Versuch eines tragfähigen Geschäftsmodells, welches auch die Brötchen der Entwickler finanzieren kann.
Und Deine Skepsis gegenüber Opensource-Bibliotheken kann ich nicht ganz nachvollziehen - Deine Begründung ist idR kein Problem von Opensource-Projekten. Ich kenne kein Projekt, was im Ansturm zuvieler Entwickler in zuvielen Commits erstickt. Vorherrschend ist eher ein Entwicklermangel, solange nicht eine Firma freiwillig Kontingente abstellt. Und das tun sie nur, wenn sie sich einen Benefit davon versprechen. Und da sehe ich eher ein Problem drin - die Nachhaltigkeit von (Opensource-)Projekten ist gefährdet, wenn es keine Brötchen finanziert (siehe oben).
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@the_real_noob:

Eine strenge Umsetzung von Entwurfsmustern ist mir in Python noch nicht untergekommen bzw. werden einige der empfohlenen Muster in Python so trivial, dass man sagen muss - "ja, dass hätt ich doch sowieso so oder sehr ähnlich gelöst". Ganz anders in C++ - dort werden die Muster zusammen mit Codepattern empfohlen, weil für den Ungeübten der Dschungel aus Deklarationsmöglichkeiten unübersichtlich ist (Templatisiert? Mehrfachvererbung? Virtuell? Abstrakt? Virtuell abstrakt? usw.), die statische Typisierung spätere Umbauarbeiten schwierig bis unmöglich macht und ein eingeschlagener Weg so zur Sackgasse werden kann.
MVC sehe ich weniger als konkretes Entwurfsmuster, eher als konzeptielles Architekturmuster. Konkretes fällt dabei nicht viel ab, daher gibt es zig "Versionen" von MVC. Und die Referenz aus Smalltalk kann man nicht ohne Weiteres auf andere Sprachen übertragen, da es zu sehr mit dessen damaligen Konzepten verwoben war.
BlackJack

@the_real_noob: Ich bin kein Befürworter des unkonventionellen Wegs. Und wer hat Java zum konventionellen Weg erklärt‽ Bitte versuch nicht die allgemeine Kritik an Deinem Vorgehen *damit* abzubügeln! Auch in Java und ganz ”konventionell” ist es falsch mit Entwurfsmustern um sich zu werfen die gar nicht gebraucht werden. Ausserdem würde ich eine eher agile Programmierung auch nicht als unkonventionell bezeichnen, denn das ist auch in Java üblich. KISS (Keep It Simple and Stupid) und YAGNI (You Ain't Gonna Need It) sind Akronyme die ich in der Java-Welt kennengelernt habe. Auch als Gegenreaktion zu den Theoretikern und Studenten die keine Erfahrung in der Softwareentwicklung haben und einen Entwurfmusterkatalog als etwas sehen, was man durchgeht und versucht alles daraus irgendwie ins Programm einzubauen, in der irrigen Annahme das dadurch das Programm automatisch besser werden muss, und das jede Flexibilität die man einbaut das Programm besser, wartbarer, und leichter anpassbar macht.

Code klar, präzise, und am Problem orientiert zu schreiben, mit möglichst wenig Angriffsfläche für Fehler, ist „best practice“. In jeder Programmiersprache.

Die Ausführungen wie man Muster verwendet, also das man einen Entwurf oder gar ein bestehendes Programm haben muss, bevor man sich über die Muster Gedanken macht, sind so im GoF-Buch, also der Klassiker wenn es um Entwurfsmuster geht, und die haben Smalltalk und C++ für ihre Beispiele genommen, und das lässt sich alles auch ganz gut auf Java übertragen.

Ich wünschte Du würdest endlich mit MVC aufhören. Das ist einfach unsinnig. Du kannst MVC allgemein nicht üben und auch nicht anwenden, weil es *das* MVC nicht gibt. Vergiss doch einfach mal diesen Begriff. Wenn Du Geschäftslogik und GUI trennen willst, dann mach das einfach. Dafür braucht man keine 3-Buchstaben-Abkürzung über die sich selbst langjährige Softwareentwickler streiten was das überhaupt bedeutet, oder frei zugeben, dass sie keine Ahnung haben was das allgemein konkret bedeuten soll.

Klar muss man sich in Rahmenwerke einarbeiten, und der Rahmen stellt auch ein Gerüst dar innerhalb dessen man sich nicht mehr so ganz frei bewegen kann, aber der Punkt ist ja, dass man sich auch nicht mehr so ganz frei bewegen *muss*, sondern man kann sich auf das Rahmenwerk abstützen und die eigene Lösung in fertige Teillösungen einbetten. Fertige, von vielen Benutzern des Rahmenwerks *getestete* Teillösungen. Also Sachen die man nicht noch mal selber erfinden und testen muss. Klar wird es manchmal Ecken und Kanten geben an denen man sich reibt, aber wenn der vorhandene `QCompleter` nicht so ganz zu meinen Bedürfnissen passt, dann fange ich doch nicht an Qt wegzuwerfen und mein eigenes GUI-Rahmenwerk zu bauen. Dann schaut man in wie weit man den `QCompleter` zur Mitarbeit bewegen kann, oder ob man etwas für die eigenen Bedürfnisse von ihm ableiten kann, oder man implementiert nur diesen Teil so wie man ihn benötigt und schmeisst nicht alles andere auch gleich mit weg. Müsste sich Dein Anliegen nicht mit dem Model erschlagen lassen? Das gibt man als unsortiert an, also nicht alphabetisch sortiert, und sortiert es dann selbst nach den eigenen Bedürfnissen. Also beispielsweise Grossstädte wie Berlin vor kleinen Orten die mit B anfangen, und oder man schaut welche Orte schon vermehrt im Datenbestand vorhanden sind, und gibt denen beim sortieren auch ein höheres Gewicht.

Die Frage bei so etwas ist IMHO ob einem das Rahmenwerk erlaubt und ermöglicht an solchen Stellen eigene Lösungen zu entwickeln. Und das tut Qt eigentlich. Selbst wenn der `QCompleter` so gar nicht dazu zu bewegen ist, das zu tun was man möchte, kann man sich die Funktionalität selbst dazu bauen.

Ich bin mir jetzt nicht ganz sicher was Du mit ”Designwechseln” meinst? Du schreibst dann eigentlich nur von oberflächlichem Kram wie Farben oder das Aussehen. Das hat nichts mit Entwurfsmustern oder dem Softwareentwurf zu tun. Was hat das mit MVC zu tun? Und was bleibt einem für eine Wahl zu *was*? Dafür trennt man ganz einfach Geschäftslogik und Benutzerinteraktion sauber voneinander. Speziell bei Webseiten ist das oft nicht einmal eine Frage des HTMLs sondern rein von CSS. Das ist meilenweit von der Geschäftslogik entfernt. Die kann man wahrscheinlich nicht mal wenn man wollte mit dem CSS vermischen. :-)

Und was das Umkrempeln von Softwareentwürfen angeht: Das passiert auch immer mal wieder. Da kann man nicht wirklich etwas gegen machen. Irgendwann hat sich auch der flexibelste Entwurf überlebt und kann nicht mehr sinnvoll angepasst werden, wenn sich die Rahmenbedingungen und Technologien zu stark geändert haben.

Also eine grössere schriftliche Ausarbeitung in einer anderen Sprache möchte ich nicht radebrechen, sondern sauber ausformulieren. Das möchte der nächste der das lesen, und vielleicht überarbeiten muss, sicherlich auch von mir. Und der möchte auch nicht das ich Redewendungen und Strukturen verwende die ich aus meiner Muttersprache kenne, mit denen Muttersprachler in der anderen Sprache aber so gar nichts anfangen können. Wer das macht ist „heavy on the woodway“.

Zudem widerspricht sich das „Hauptsache es funktioniert“, mit haufenweise unnötigem Code schreiben, auf den Verdacht, dass der *vielleicht* irgendwelche Probleme lösen könnte, die man *vielleicht* irgendwann bekommen könnte. Wenn Funktionalität wichtig ist, dann ist es auch eine möglichst knappe, klare, präzise, direkt auf das tatsächlich vorliegende Problem gerichtete Formulierung der Lösung. Um zur Sprache zurück zu kommen: Wenn ich in einer fremden Sprache eine Lösung erklären will, versuche ich so wenig wie möglich zu radebrechen und so präzise es mir möglich ist, auf den Punkt zu kommen. Ich werde sicher nicht anfangen meine Erläuterungen unnötig mit irgendwelchen Ausschweifungen auszuschmücken von denen ich mal gehört habe, das man die vielleicht in diesem Kontext irgendwie anbringen könnte, und das vielleicht helfen würde die Lösung zu verstehe wenn das Problem grösser wäre als es tatsächlich ist. Das birgt die Gefahr das mich mein Gegenüber falsch oder gar nicht versteht, und das obwohl ich ja eigentlich eine Lösung habe, die ich kommunizieren möchte.

Bezüglich der Webanwendungen: Der Trend geht deutlich in die Richtung. Die grossen Anbieter wollen das so. Sei es Google, die das ja schon sehr lange wollen — aber auch Microsoft will den Leuten lieber Cloudlösungen andrehen als Office und Outlook für den lokalen Rechner beim Kunden. Und die Kunden wollen das mehr oder weniger auch, oder es ist ihnen egal. Die jüngeren kennen es dann gar nicht mehr anders. Die Absatzzahlen für klassiche PCs ist schon eine Weile rückläufig — Mobilgeräte sind das was die Leute kaufen. Smartphones und Tablets oder auch schwach ausgestattete, aber sehr günstige Laptops, bei denen man beim Kauf gleich Cloudspeicher und -anwendungen mit aufs Auge gedrückt bekommt. Regionen mit schlechter Anbindung ans Netz sind heute noch ein Problem, das wird sich aber auf die eine oder andere Weise lösen. Wenn nicht durch den Netzausbau durch Private und/oder Staat, dann letztendlich durch den Trend, dass die Leute auf der ganzen Welt immer mehr vom Land in die Städte ziehen. Irgendwann sind die paar Leute die dann noch irgendwo in der unerschlossenen Pampa leben für die Anbieter einfach egal, weil sich das nicht rechnet Rücksicht auf die zu nehmen. Bei uns hat alleine die Telekom schon Interesse alle mit Internet zu versorgen, denn das analoge Telefonnetz wollen sie auf lange, oder vielleicht sogar schon mittelfristige Sicht, loswerden. Da es aber einen Versorgungsauftrag gibt, muss dann Internet oder Funkabdeckung her.

Webanwendungen kann man auch immer besser ohne ständige Netzanbindung laufen lassen. HTML5 bietet Mechanismen um Daten auch lokal zu speichern und in einem Manifest anzugeben welche Daten/Dateien die Anwendung braucht um Offline zu funktionieren. Und es gibt Ansätze wie Electron, also einen Browser als Ablaufplattform für lokale Programme zu verwenden. Oder Apache Cordova/Phonegap die eine ”Webanwendung” als Mobilanwendung verpacken können.

Auch für PCs kann es eine Lösung sein keine native GUI zu implementieren, sondern die Webanwendung samt Server an den Benutzer auszuliefern, der sie dann lokal laufen lässt. Vielleicht sogar auf einem Server zuhause. Wenn ein Browser oder ein ”WebView” nicht angemessen für eine GUI ist, kann man immer noch eine native GUI für die Webanwendung, also dann eher ein Webservice, bauen.

Deinen Ausführungen zu OpenSource und Unternehmen kann ich nicht ganz folgen. Hinter Qt hat *auch* mal Nokia gesteckt, aber das existierte ja auch davor und es war immer eine Firma die das entwickelt hat, aber auch immer als OpenSource (auch während der Nokia-Zeit), und neben den Leuten die die kommerzielle Lizenz gekauft haben, wird die meiste Rückmeldung wohl von der OpenSource-Gemeinschaft gekommen sein, denn das Toolkit ist schon sehr lange die Basis für die KDE-Desktop-Umgebung. Qt ist IMHO keine ausgereiftes GUI-Rahmenwerk weil Nokia das mal in der Hand hatte, sondern Nokia hat das Rahmenwerk eingekauft weil es gut war. Das eine Firma hinter einem Projekt steht ist nicht wichtig, wirklich wichtig ist das es ausreichend viele Benutzer gibt, denn dann ist die Wahrscheinlichkeit sehr viel grösser das es sich an den Bedürfnissen der Benutzer orientiert, und nicht nur an denen der direkten Entwickler. Das kann nämlich auch bei Unternehmen ein Problem sein, wenn die nur für ihre eigenen Bedürfnisse entwickeln und ein Projekt damit in eine Richtung geht, die allgemein nicht mehr interessant ist.

OpenSource bedeutet auch nicht automatisch, dass es viele Köche gibt. Ich denke das ist sogar eher selten, dass es (zu) viele Entwickler in einem Projekt gibt. Das Problem sind in der Regel eher zu wenige Entwickler. Also beispielsweise nur einer und man muss Angst haben, das der irgendwann die Lust verliert oder einen Unfall hat. Oder Unternehmen wo man nicht weiss in welche Richtung die gehen wollen und deren Motivationen nicht immer nur technischer Natur sind. Oder sie gehen pleite. Oder werden aufgekauft und dem neuen Besitzer ist das OpenSource-Softwareprojekt, das er da mitgekauft hat egal, oder es ist ein Konkurrenzprodukt und er möchte es am liebsten plattmachen.

Ich glaube nicht das man die Qualität so einfach an OpenSource oder nicht festmachen kann. Da spielen einfach zu viele Faktoren mit rein und man muss bei jeder Bibliothek die gleiche Skepsis walten lassen.
Antworten