2014-10-02 3 views
7

QT scheint das beste plattformübergreifende GUI-Toolkit zu sein. Leider ist es in C++, und Bindings dafür zu vielen interessanten Sprachen (wie D, Rust, Julia, und Mono on * nix) sind entweder nicht verfügbar oder werden nicht aufrechterhalten. GTK Bindings sind normalerweise verfügbar, aber GTK sieht auf Windows und (besonders) OS X hässlich aus. WxWidgets Bindings wären auch nett, aber nicht verfügbar oder werden für D, Rust und Julia nicht gepflegt (Für Julia könnte ich Python für beide Toolkits, aber das ist langsam und ungeschickt).Wie kann ich einem QT GUI zu einem Nicht-C++ Hauptprogramm beitreten?

Wie kann ich meine C++ - GUI an ein Nicht-C++ - Hauptprogramm binden?

+2

Wickeln Sie Ihre Qt-Routinen als C-Funktionen; Die meisten Sprachimplementierungen akzeptieren C externe Funktionen. An welche Sprache denken Sie? –

Antwort

9

Sie haben hier eine Handvoll Optionen.

Als Erstes können Sie Ihre GUI und Ihre Hauptanwendung über die C-API binden. GUIs werden normalerweise über Callbacks ausgeführt, die über eine Ereignisschleife aufgerufen werden. Daher müssen Sie Funktionen in Ihrer Hochsprache als C-Callbacks verfügbar machen, damit sie aus der Ereignisschleife aufgerufen werden können. Dann müssen Sie die Qt-Ereignisschleife starten. Je nachdem, welche Sprache Sie verwenden, gibt es mehrere Möglichkeiten. Wenn Sie beispielsweise Rust verwenden, können Sie eine statische oder dynamische Bibliothek erstellen und Ihr C++ - GUI-Programm damit verknüpfen. In diesem Fall ist der "Einstiegspunkt" Ihres Programms der C++ - Teil. Wenn Sie etwas wie Julia verwenden, werden Sie wahrscheinlich den C++ - Teil als eine Bibliothek kompilieren wollen, die auch eine Funktion verfügbar machen würde, die Qt-Ereignisschleife aufruft. In diesem Fall ist also der "Einstiegspunkt" Ihr übergeordneter Teil, der immer noch in die C++ - Bibliothek zurückgerufen werden muss.

Der zweite Ansatz ist näher an Web-UIs. Sie können Ihre GUI zu einem Client für Ihre Hauptanwendung machen, der in einer anderen Sprache geschrieben ist. Sie können Nachrichten über ein vorhandenes Protokoll austauschen, z. B. HTTP, oder Sie können Ihr eigenes Protokoll über eine Low-Level-TCP- oder UDP-Verbindung implementieren, oder Sie können Nachrichtenbibliotheken der "mittleren Ebene" wie ZeroMQ oder nanomsg verwenden. Sie können auch Qt insgesamt löschen und einfach eine Web-App mit Ihrem Programm als Webserver schreiben. Dies ist der plattformübergreifendste Weg, um eine GUI jetzt zu schreiben, denke ich :)

+0

Wäre der zweite Ansatz der beste, wenn ich die Benutzeroberfläche als modulare Komponente betrachten möchte, die später neu geschrieben werden kann (z. B. für natives Aussehen und Verhalten)? – Demi

+0

@Demetri, ich glaube ja, da es entkoppelter als direkte C-Bindungen sein wird. –

+0

Also, mit all diesen Optionen, was sind die Geschwindigkeitsunterschiede (in Bezug auf die Weitergabe von Daten von der GUI an das Backend, Backend-Verarbeitung zum Übergeben von Ergebnissen zurück zu GUI für das Rendern) wenn: 1. GUI und Backend in derselben Sprache (sagen Qt und C++) 2. GUI und Backend in verschiedenen Sprachen (zB C++ Qt/Julia) 3. Webapp, wo GUI im Browser gerendert wird, mit Programm als Server Was wäre ein guter Weg, um diese Optionen zu profilieren? – Asy