Aus einer DLL GUI (QT) anzeigen



  • Hallo.

    Habe mit vc++ eine DLL erstellt die Exportfunktionen bereit stellt.
    Um nun ein paar Laufzeitinformationen darzustellen sollte ich eine GUI anzeigen.

    Bisher habe ich hierzu einen MFC Dialog verwendet. Die DLL wurde komplett überarbeitet und ich würde nun gerne von MFC weg kommen und stattdessen QT verwenden.

    Mit QT hatte ich bisher keine Erfahrungen und habe mir nun ein paar kleine Beispiele angeschaut und auch mal ein Projekt angelegt im Visual Studio mit einem Plugin.

    Hier kann ich mir verschiedende Qt Projekte anlegen

    Qt Active Server / Qt Class Library / Qt Console Application / Qt Designer Custom Widget / Qt GUI Application

    Aber wie bekomme ich nun QT in eine bestehende Visual c++ DLL?



  • Leg einfach eine neue "Qt Class Library" an und übernehme die dortigen Einstellungen dann für dein bisheriges DLL-Projekt,



  • Ok. Danke für den Tipp. Werde ich gleich testen. Mal gespannt ob die Anwendung (WinCC von Siemens) die DLL dann noch laden kann.

    ...

    Welche Module sollte ich den für den Anfang auswählen um mir eine einfache GUI zu erstellen mit einem GridControl

    Auswahl derer die mit GUI was zu tun haben.

    • GUI
    • QML
    • QT Quick
    • QT Quick Widgets
    • Quick Controls2
    • Widgets


  • Es müßte "Widgets" (für den Anfang) ausreichen (neben "Qt Core"). QML und darauf aufbauend "Qt Quick" benutzen eine auf XML basierende, deklarative Beschreibung zur Erstellung der Controls.

    In einem standard-gebauten QT müssten aber alle Module schon enthalten sein, welche du dann nur über die entsprechenden Headerdateien (z.b. <QtWidgets>) einbinden mußt.

    Das QTableView müßte wohl einem Grid Control entsprechen.
    Du solltest dich auf jeden Fall in Model/View Programming einlesen, falls du bisher damit noch nicht gearbeitet hast (MFC verwendet dies [standardmäßig] nicht - afaik).

    Edit: OK, nicht auf XML basierend, sondern eher JSON-artig...



  • @Th69 QML ist kein XML format.
    Es ist eher an JSON angelehnt



  • Danke Th69 für deine Hilfe

    QML und Qt Quick habe ich mir schon angeschaut. Finde ich ganz interessant, da ich auch Anwendungen in c# und WPF mache und da gibt es ja paralellen zwischen qml und xaml.

    Aber ob ich nun Qt Widget verwende oder Qt Quick verwende muss ich anfangs festlegen. Das baut nicht aufeinenader auf. Oder? Ist wahrscheinlich wie Winforms und WPF in .net. Zwei verschiedene Technologien?

    Zum Thema Model/View:
    Ja ok. In WPF verwenndet man ja MVVM. Model-View-ViewModel. Model/View wird in die gleiche Richtung gehen. Trennung von GUI und Logik.
    ...

    Ich habe nun jeweils eine Qt Class Library angelegt.
    Einmal im Visual Studio 2017 und im Qt Creator 4.6.2

    Aber wie bekomme ich da nun einen Dialog angelegt.
    Im Creator ist der Design Button deaktiviert und im Visual Stuido kann ich zwar auf "Resource View" und einen Dialog hinzufügen via Add Resource aber das sieht eher nach MFC Dialog aus.



  • @firefly
    Ja richtig. Das finde ich auch persöhnlich übersichtlicher wie xml.



  • OK, habe meinen Beitrag oben nacheditiert.

    Du kannst den QT Designer separat dafür benutzen (es kann sein daß im "Qt Creator" nur für GUI-Projekte der integrierte Designer aufrufbar ist).



  • Aha. Der Qt Designer muss ich mir nun noch extra installieren? Den integrierten Designer im Creator kann man nicht ausserhalb starten.

    ...

    Wenn ich dann so einen Dialog erzeugt habe speichere ich diesen einfach in meiner Class Library ab!?

    Und wie rufe ich den Dialog dann (nicht blockierdend) auf?



  • Es müßte eine "designer.exe" geben, s.a. How to install QtDesigner?

    Für einen nicht-blockierenden Dialog (bzw. Fenster) wird eine Message-Loop benötigt, welche normalerweise mittels QApplication::exec aufgerufen wird. Da dieser Aufruf jedoch selber blockierend ist (solange das Hauptfenster nicht geschlossen wird), benötigst du eine andere Methode - dabei müßte QCoreApplication::processEvents helfen, welches du dann regelmäßig (z.B. mittels eines Timers) aufrufen müßtest.

    Edit: exit -> exec



  • Wenn ich die designer.exe starte erhalte ich den Designer um Qt Widgets zu erstellen. Ich würde aber gerne Qt Quick verwenden. Sind das zwei unterschiedliche Tools? Wo ist der Qt Quick Designer?

    @th69 sagte in Aus einer DLL GUI (QT) anzeigen:

    QApplication::exit

    Da kann doch was nicht stimmen, exit um etwas zu starten. -> Der Link brachte dann die Erkenntnis. Es muss "exec" heißen.

    @th69 sagte in Aus einer DLL GUI (QT) anzeigen:

    dabei müßte QCoreApplication::processEvents helfen, welches du dann regelmäßig (z.B. mittels eines Timers) aufrufen müßtest.

    Muss das wirklich so kompliziert gemacht werden? Kann ich nicht einfach ein Hauptfenster starten wie bei einer exe?



  • Ups, Tippfehler (oben korrigiert).

    Mit Qt Quick kenne ich mich nicht so aus (der Qt Quick Designer scheint wohl Teil vom "Qt Creator" zu sein, weiß aber nicht, ob es auch eine eigene EXE dafür gibt).

    Und du hast ja geschrieben, daß deine DLL von einer anderen Anwendung aus verwendet wird.
    Wenn du dann eine blockierende Anweisung (wie Application::exec) aufrufst, dann läuft doch die Anwendung nicht weiter, oder?
    Wie hast du denn bisher deine MFC-Fenster dort aufgerufen (auch mit eigener Message-Loop)?



  • @th69 sagte in Aus einer DLL GUI (QT) anzeigen:

    Wie hast du denn bisher deine MFC-Fenster dort aufgerufen (auch mit eigener Message-Loop)?

    class CRuntimeInfoDlg : public CDialog
    {
    ...
    }
    
    void Show()
    {
       m_dlgRuntimeInfo = new CRuntimeInfoDlg(this);
       m_dlgRuntimeInfo->Create(CRuntimeInfoDlg::IDD);
    
       m_dlgRuntimeInfo->ShowWindow(SW_SHOW);
    }
    


  • Also verwendest du die Message-Loop der Applikation (über WinAPI) .
    Da QT aber eine eigene Implementierung der Message-Loop für seine Widgets (z.B. QWindow) bereitstellt (und benötigt), hilft also nur der Ansatz mittels processEvents (und Timer).



  • @th69 sagte in Aus einer DLL GUI (QT) anzeigen:

    Also verwendest du die Message-Loop der Applikation (über WinAPI) .

    Ja klar. Dass ich ne Message Loop brauche ist mir klar. Dachte halt es geht so einfach wie in MFC - habe ich jetzt wirklich geschrieben -> so einfach wie in MFC 😄. Das will was heißen.

    Andere Frage: Gibt es in QT auch irgendwelche Komfortablen Controls also jetzt speziell die TableView.
    In WPF nutzen wir die Controls von Devexpress. (Kommerziell)
    Da habe ich natürlich Funktionen ohne Ende. (Sortieren, Filtern, Suchefunktion, Styles, Spalten verschieben usw.)

    Gibt es solche Controls auch bei QT auch gerne von Drittanbietern?





  • @manni66: die Suche führt nicht wirklich weiter.

    Unter #inqlude - The Qt library archive gibt es eine Liste von 3rd-party libs (bzw. für dich interessant: Widgets).

    Aber schau ersteinmal, ob du überhaupt ein QT-Fenster aus deiner App heraus angezeigt bekommst.



  • @manni66 sagte in Aus einer DLL GUI (QT) anzeigen:

    http://lmgtfy.com/?q=qt+tableview

    Du kannst googeln. Wahnsinn. Freut mich für dich.

    @th69 sagte in Aus einer DLL GUI (QT) anzeigen:

    @manni66: die Suche führt nicht wirklich weiter.

    Sehe ich genau so.

    @th69 sagte in Aus einer DLL GUI (QT) anzeigen:

    Unter #inqlude - The Qt library archive gibt es eine Liste von 3rd-party libs (bzw. für dich interessant: Widgets).
    Danke für den Link. Und wo finde ich da nun eine komfortable TableView?
    Widgets? Heißt so die library? Suche doch was für qt quick. Bin verwirrt.

    @th69 sagte in Aus einer DLL GUI (QT) anzeigen:

    Aber schau ersteinmal, ob du überhaupt ein QT-Fenster aus deiner App heraus angezeigt bekommst.

    Natürlich das wird mein oberstes Ziel sein.


Log in to reply