Wie erstelle ich eine grafische Benutzeroberfläche in C ++? [geschlossen]


270

Alle meine C ++ - Programme haben bisher die Befehlszeilenschnittstelle verwendet und die einzige andere Sprache, mit der ich Erfahrung habe, ist PHP, das keine GUIs unterstützt.

Wo fange ich mit der grafischen Programmierung der Benutzeroberfläche in C ++ an? Wie erstelle ich eine?


4
Es hängt davon ab, ob. Auf welche Art von Betriebssystem zielen Sie ab? Viele GUI-Frameworks sind betriebssystemspezifisch.
Michael Ratanapintha

3
Welches Betriebssystem / welche Plattform? Oder wenn Sie plattformübergreifende GUI-Apps schreiben
möchten

3
PHP unterstützt das Schreiben von GUI-Programmen. Es gibt keinen Grund, warum Sie PHP-Programme nicht über die Befehlszeile ausführen können, und es gibt GUI-Bibliotheken wie PHP-GTK gtk.php.net und PHP-Qt php-qt.org , die Ihnen helfen können. Vielleicht möchten Sie auch bewerten, warum Sie sie benötigen c ++. Das Schreiben von GUIs in C ++ ist schwieriger als in vielen anderen Sprachen, und Sie können Ihren C ++ - Code möglicherweise in Bibliotheken bündeln, die von Python oder C # oder PHP aufgerufen werden können, oder in etwas, für das GUIs etwas einfacher zu codieren sind.
Kibibu

6
Ihre Frage ist so weit gefasst, dass ich denke, Sie möchten nicht nur die Namen von Toolkits oder auch nur einige Tutorials. Sie möchten einige Bücher , die Ihnen mehr bieten als APIs oder Beispiele, die Ihnen tatsächlich Konzepte geben. KTC empfiehlt einige davon unten, aber ich würde vorschlagen, dass Sie unabhängig davon, mit welchem ​​Toolkit Sie spielen möchten, eines finden, über das Sie auch lesen können.
Quark

6
"Das Schreiben von GUIs in c ++ ist schwieriger als in vielen anderen Sprachen." Worauf stützen Sie diese Behauptung?
Piotr

Antworten:


163

Im Wesentlichen macht das Fenstersystem eines Betriebssystems einige API-Aufrufe verfügbar, die Sie ausführen können, um Aufgaben wie das Erstellen eines Fensters oder das Einfügen einer Schaltfläche in das Fenster auszuführen. Grundsätzlich erhalten Sie eine Reihe von Header-Dateien und können Funktionen in diesen importierten Bibliotheken aufrufen, genau wie Sie es mit stdlib und tun würden printf.

Jedes Betriebssystem verfügt über ein eigenes GUI-Toolkit, eine Reihe von Header-Dateien und API-Aufrufen sowie eine eigene Vorgehensweise. Es gibt auch plattformübergreifende Toolkits wie GTK , Qt und wxWidgets , mit denen Sie Programme erstellen können, die überall funktionieren. Sie erreichen dies, indem sie auf jeder Plattform dieselben API-Aufrufe haben, jedoch eine andere Implementierung für die API-Funktionen, die die nativen API-Aufrufe des Betriebssystems aufrufen.

Eine Sache, die sie alle gemeinsam haben und die sich von einem CLI-Programm unterscheidet, ist eine sogenannte Ereignisschleife. Die Grundidee dort ist etwas kompliziert und schwer zu komprimieren, aber im Wesentlichen bedeutet dies, dass in Ihrer Hauptklasse / Hauptfunktion nicht viel los ist, außer:

  • Überprüfen Sie die Ereigniswarteschlange, wenn neue Ereignisse vorhanden sind
  • Wenn dies der Fall ist, senden Sie diese Ereignisse an die entsprechenden Handler
  • Wenn Sie fertig sind, geben Sie die Ertragskontrolle an das Betriebssystem zurück (normalerweise mit einem speziellen Funktionsaufruf "Schlaf" oder "Auswählen" oder "Ertrag").
  • Dann kehrt die Yield-Funktion zurück, wenn das Betriebssystem fertig ist, und Sie müssen die Schleife erneut durchlaufen.

Es gibt viele Ressourcen zur ereignisbasierten Programmierung. Wenn Sie Erfahrung mit JavaScript haben, ist dies dieselbe Grundidee, außer dass Sie als Scripter keinen Zugriff oder keine Kontrolle über die Ereignisschleife selbst haben oder welche Ereignisse vorhanden sind. Ihre einzige Aufgabe besteht darin, Handler zu schreiben und zu registrieren.

Sie sollten bedenken, dass die GUI-Programmierung im Allgemeinen unglaublich kompliziert und schwierig ist. Wenn Sie die Option haben, ist es tatsächlich viel einfacher, einfach einen eingebetteten Webserver in Ihr Programm zu integrieren und über eine HTML / webbasierte Oberfläche zu verfügen. Die einzige Ausnahme, auf die ich gestoßen bin, sind Apples Cocoa + Xcode + Interface Builder + Tutorials, die es für Benutzer, die noch keine Erfahrung mit GUI-Programmierung haben, leicht zugänglich machen.


" Es ist tatsächlich viel einfacher, einfach einen eingebetteten Webserver in Ihr Programm zu integrieren und über eine HTML / Web-basierte Oberfläche zu verfügen. " Das hängt davon ab. Wenn Sie ausgefallene Dinge tun möchten (komplexe Benutzeroberfläche, benutzerdefinierte Steuerelemente, Animationen usw.), ja. Wenn Sie einfach eine typische GUI (mit den üblichen Steuerelementen und einem nativen Gefühl) möchten, nein.
Eichel

167

Es gibt viele kostenlose tragbare GUI-Bibliotheken mit jeweils eigenen Stärken und Schwächen:

Besonders Qt hat nette Tutorials und Tools, die Ihnen den Einstieg erleichtern. Genießen!

Beachten Sie jedoch, dass Sie plattformspezifische Funktionen wie die Win32-API oder MFC vermeiden sollten . Das bindet Sie unnötig an eine bestimmte Plattform ohne Vorteile.


25
Persönlich finde ich die Programmierung auf die Win32-API sehr schön. Ich mag es viel mehr als Qt zu verwenden, und das an und für sich ist ein Vorteil. Vielleicht bin ich es aber auch.
Mrduclaw

6
Meine persönliche Erfahrung ist genau das Gegenteil. Die Win32-API hat mir mehr Probleme bereitet als jede andere API.
Vog

17
@mrduclaw, "Ich finde die Programmierung auf die Win32-API wunderschön". Ich versuche um jeden Preis, tragbaren Code zu schreiben. (Bitte beachten Sie, dass ich das Wort "try" verwendet habe, da es Ausnahmen gibt ...) Wie wird das Schreiben von nicht portierbarem Code als "schön" angesehen?
Trevor Boyd Smith

11
@ Trevor Boyd Smith: Verschiedene Ziele, nehme ich an. Fast keiner der Codes, die ich jemals professionell geschrieben habe, könnte möglicherweise plattformübergreifend gewesen sein, daher war mir das nie ein Anliegen.
Mrduclaw

1
Die Millionen-Dollar-Frage ist, dass die Leute, die Spieletrainer herstellen, nur kleine Exe liefern und ihre Programme eine schöne Benutzeroberfläche haben. Ich frage mich also, wie sie die Benutzeroberfläche erstellen, die sie diesen Bibliotheken von Drittanbietern nicht zur Verfügung stellen.
user889030

74

Betriebssystemunabhängiger Algorithmus " Erstellen von GUI-Anwendungen in C ++ in drei Schritten ":

  1. Installieren Sie Qt Creator

    Geben Sie hier die Bildbeschreibung ein

  2. Neues Projekt erstellen (Qt Widgets Application)

    Geben Sie hier die Bildbeschreibung ein

  3. Baue es.

Herzlichen Glückwunsch, Sie haben Ihre erste GUI in C ++.

Jetzt können Sie eine Menge Dokumentation lesen , um etwas Komplizierteres als die GUI-Anwendung "Hello World" zu erstellen.


In der Vergangenheit hatte ich Probleme damit, dass andere GUIs nicht anfängerfreundlich genug waren. Aber Qt hat einige großartige Tutorials. Vielen Dank für die Empfehlung!
JD

23

Angesichts des Kommentars "Sagen Sie Windows XP als Beispiel" haben Sie folgende Möglichkeiten:

  • Interagieren Sie direkt mit dem Betriebssystem über seine API, die für Microsoft Windows überraschend überraschend ist. Rufen Sie die Windows-API auf . Die endgültige Referenz für die WinAPI ist die MSDN-Website von Microsoft . Ein beliebtes Online-Tutorial für Anfänger ist das Win32 API-Programmier-Tutorial von theForger . Das klassische Buch dafür ist Charles Petzolds Programmierfenster, 5. Auflage .

  • Verwenden Sie eine plattformspezifische Bibliothek (sowohl in Bezug auf das Betriebssystem als auch in Bezug auf den Compiler) wie MFC , die die WinAPI in eine C ++ - Klasse einbindet. Die Referenz dafür ist wieder MSDN. Ein klassisches Buch dafür ist Jeff Prosises Programming Windows with MFC, 2nd Edition . Wenn Sie beispielsweise CodeGear C ++ Builder verwenden, ist die Option hier VCL .

  • Verwenden Sie eine plattformübergreifende Bibliothek wie GTK + (C ++ - Wrapper: gtkmm ), Qt , wxWidgets oder FLTKdas umschließt die API des spezifischen Betriebssystems. Die Vorteile dabei sind, dass Ihr Programm im Allgemeinen für verschiedene Betriebssysteme kompiliert werden kann, ohne dass die Quellcodes geändert werden müssen. Wie bereits erwähnt, haben sie jeweils ihre eigenen Stärken und Schwächen. Eine Überlegung bei der Auswahl der zu verwendenden ist die Lizenz. Für die angegebenen Beispiele ist GTK + & gtkmm eine Lizenz unter LGPL, Qt unter verschiedenen Lizenzen, einschließlich einer proprietären Option, wxWidgets unter seiner eigenen wxWindows-Lizenz (mit einer Umbenennung in wxWidgets-Lizenz) und FLTK unter LGPL mit Ausnahme. Einzelheiten, Anleitungen und / oder Bücher finden Sie auf der jeweiligen Website.


9
MFC ist böse. Ich würde es vorziehen, die WIN-API zu verwenden, wenn ich keine andere Wahl hätte.
the_drow


18

Da ich schon dort war, wo du gerade bist, denke ich, dass ich dir "antworten" kann.

Tatsache ist, dass es keine einfache Möglichkeit gibt, eine GUI zu erstellen. GUIs hängen stark von plattform- und betriebssystemspezifischem Code ab. Aus diesem Grund sollten Sie die Dokumentation Ihrer Zielplattform / Ihres Betriebssystems zu Fensterverwaltungs-APIs lesen. Das Gute ist: Es gibt viele Bibliotheken, die diese Einschränkungen und abstrakten Architekturunterschiede in einer einzigen Multi-Plattform-API behandeln. Die zuvor vorgeschlagenen GTK und Qt sind einige dieser Bibliotheken.

Aber auch diese sind etwas zu kompliziert, da viele neue Konzepte, Datentypen, Namespaces und Klassen gleichzeitig eingeführt werden. Aus diesem Grund werden sie mit einem GUI WYSIWYG-Editor geliefert. Sie ermöglichen so ziemlich Programmiersoftware mit GUIs.

Zusammenfassend gibt es auch nicht freie "Umgebungen" für die GUI-Entwicklung wie Visual Studio von Microsoft. Für Personen mit Delphi- Erfahrung ist Visual Studio möglicherweise vertrauter. Es gibt auch kostenlose Alternativen zur vollständigen Visual Studio-Umgebung von Microsoft: Visual Studio Express , das mehr als genug ist, um mit der GUI-Entwicklung zu beginnen.


15

Ich habe eine Website mit einem "einfachen" Tutorial gefunden: http://www.winprog.org/tutorial/start.html


8
Dies führt die Win32-API ein, einen sehr einfachen Ansatz für die GUI-Programmierung, der Sie an die Windows-Plattform bindet. Das würde ich nicht empfehlen.
Vog

17
Es ist eine gültige Option. Ich bin damit einverstanden, dass es vielleicht nicht der beste Startpunkt ist, aber es verdient keine Abwertung.
Emil H

1
Ich weiß, dass dies nicht die ideale Lösung ist, aber es hilft zu lernen, wie das GUI-System in Windows funktioniert. Ich habe dieses Tutorial vor ein paar Jahren gelesen und weiß jetzt, was die Nachrichtenschleife ist und wie sie funktioniert. Bei der Arbeit mit Winforms in .net kann dieses Wissen hilfreich sein.
ZippyV

7
Wenn Sie Desktop-Anwendungen schreiben möchten, gibt es keinen Ersatz dafür, zu wissen, wie das Betriebssystem den Benutzer wirklich rendert und mit ihm interagiert. Wenn Sie nur eine Bibliothek verwenden, ohne die Grundlagen zu verstehen, werden Sie nie wirklich verstehen, was los ist. Das Erlernen eines kleinen Teils der Win32-GUI-Programmierung auf niedrigem Niveau ist eine gute Zeit.
Jim In Texas

@ Jim In Texas: Ich stimme zu, aber dieses "bisschen niedrige Niveau" sollte nach den Grundlagen gelernt werden , daher finde ich diese Empfehlung für Anfänger immer noch unangemessen.
Vog

3

Es ist einfach, eine .NET Windows-Benutzeroberfläche in C ++ zu erstellen.

Siehe das folgende Tutorial von MSDN . Sie können alles, was Sie brauchen (Visual C ++ Express), kostenlos herunterladen .

Natürlich binden Sie sich an .NET, aber wenn Sie nur herumspielen oder nur eine Windows-Anwendung benötigen, ist alles in Ordnung (die meisten Leute haben noch Windows ... für jetzt).


3

Ich benutze FLTK, weil Qt nicht kostenlos ist. Ich wähle nicht wxWidgets , weil mein erster Test mit einem einfachen Hallo, Welt! Programm produziert eine ausführbare Datei von 24 MB, FLTK 0,8 MB ...


4
Aufgrund der Lizenzänderungen QT, plane ich auf Umstellung auf QT
Pernecker

2
Mein eigenes wxWidgets-Programm ist 5,9 MB
groß
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.