QT 4.4.0 + Visual Studio Integration

Nach langer Zeit kommt nun wieder ein Blogeintrag von mir. Im heutigen Artikel werde ich über die bekannte QT Bibliothek von Trolltech schreiben. Viele von uns sind aus finanziellen Gründen gezwungen die Open Source Version zu nutzen.

Die kommerzielle Version bringt zwar die automatische Integration in Visual Studio mit sich, dafür kostet diese Version einiges und ist nicht jedermanns Sache. Mit diesem Artikel will ich die Integration Schritt für Schritt so einfach wie möglich erklären.

Vorbereitung

Bevor wir mit der Integration überhaupt beginnen, wollen wir uns erstmal Vorbereiten. Falls sie schon das SP1 für Visual Studio installiert haben oder es demnächst installieren wollen benötigen wir das Hotfix KB930198. Der direkte Bezug von Microsoft ist nur bei der englischen Version von VS möglich. Nutzer der deutschen Version sind auf andere Quellen angewiesen. Unten in meinen Referenzen werdet ihr einen Link finden, wo ihr das Hotfix runterladen könnt. Als nächstes besorgt ihr euch QT. Achtet darauf, dass es die Open Source Version ohne Mingw ist e.g. qt-win-opensource-src-4.4.0.zip. Entpackt nun das runtergeladene Qt-Paket in ein Verzeichnis eurer Wahl e.g. D:\QT4.

Umgebungsvariablen

Jetzt wollen wir unserem Betriebssystem QT bekannt machen. Dafür müssen wir bestimmte Umgebungsvariablen setzen.

Dafür gehen wir zunächst in System rein. Erreichbar mit Superkey (Windowstaste) + Pause oder über die Systemsteuerung. Danach wechseln wir über den Erweitert-Reiter zu den Umgebungsvariablen. Unter Systemvariablen erstellen wir nun unsere Variablen mit den dazugehörigen Werten.

Hier verwende ich als Beispiel den Pfad D:\QT4, den müsst ihr bei euch natürlich anpassen.

QTDIR       D:\QT4
INCLUDE   %QTDIR%\include
LIB            %QTDIR%\lib
PATH        %QTDIR%\bin


QT Installation

Nachdem ihr QT entpackt und die Umgebungsvariablen gesetzt habt müsst ihr die “Visual Studio Command Prompt” öffnen. Das ist nichts anderes als die normale Windows Konsole nur angepasst an die Anforderungen von VS.

Die Konsole erreicht ihr über:

Startmenü -> Programme -> Microsoft Visual Studio 2005 ->
Visual Studio Tools

Nun wechselt ihr in euer QT Verzeichnis (cd %QTDIR%). Als nächstes müssen wir die Quelldateien konfigurieren bevor wir sie kompilieren können.

Dafür geben wir folgenden Befehl ein:

configure -platform win32-msvc2005 -no-qt3support
-qt-sql-odbc -qt-sql-sqlite -qt-zlib -qt-libpng
;

Hier sagen wir configure, dass er die Dateien für eine win32 Platform mit VS2005 erzeugen soll. Ich verzichte absichtlich auf QT3. Falls ihr es brauchen solltet lasst einfach “-no-qt3support” weg. Die folgenden Parameter sind optional, daher könnt ihr sie auch weglassen.

Diese Konfiguration dauert nun ein Weilchen, holt euch währenddessen einen Kaffee……

So..ihr seid nun mit der Konfiguration fertig. Freut euch nicht zu früh, denn jetzt kommt nmake. Damit wird der Kompilierungsvorgang angestoßen. Dieser Vorgang wird viel länger dauern, daher empfehle ich euch währenddessen was anderes zu machen…
So..damit seid ihr also auch fertig. Schön!

Macht euch nun am besten zwei Verknüpfungen auf euer Desktop. Diese zwei werdet ihr öfters brauchen. Zum einen gibt es da den QT Designer und die QT Hilfe. Beide werden euch ein QT-Leben lang begleiten.

%QTDIR%\bin\designer.exe

;%QTDIR%\doc\html\index.html


Beispielprojekt

Erzeugt euch zunächst ein neues leeres Win32-Projekt. Im Assistenten wählt ihr “leeres Projekt” und “Windows Anwendung”.  Als erstes erzeugen wir uns die main.cpp, da sie unser Einstiegspunkt sein wird. Den Inhalt können wir zunächst leer lassen.

In diesem Beispiel soll unsere Anwendung  ein einfaches Fenster erzeugen, mehr nicht! Dies dürfte als Demonstration ausreichend sein.

Dafür legen wir nun eine C++ Klasse an. Wir nennen sie mywindow. Die Basisklasse ist die QMainWindow. Da VS QMainWindow noch nicht kennt, wird er meckern. Ignoriert einfach diese Meldung und klickt auf Ja. Nun habt ihr drei Dateien in eurem Projekt die main.cpp, mywindow.cpp und die mywindow.h.

Als nächstes wechselt ihr in die Projekteigenschaften. Hier wählt ihr als Konfiguration “Alle Konfigurationen” (linke obere Kombobox). Im linken Bereich des Fensters wechselt ihr zu C/C++ und fügt auf der rechten Seite bei “Zusätzliche Includeverzeichnisse”
die Werte “$(QTDIR)\include”;”$(QTDIR)\include\Qt”;

Als nächstes ist der Linker dran. Wie eben wechseln wir nun links zu Linker und fügen auf der rechten Seite bei “Zusätzliche Bibliotheksverzeichnisse” den Wert $(QTDIR)\lib ein. Wir bleiben kurz noch bei Linker. Bevor wir fortfahren wechseln sie wieder die Auswahl in der Kombobox. Diesmal auf Debug.

Unter Linker werden sie “Eingabe” sehen. Wechseln sie dorthin und geben sie auf der rechten Seite bei “Zusätzliche Abhängigkeiten”
die Werte qtmaind.lib QtGuid4.lib QtCored4.lib ein.

Genau die Selbe Option setzen wir auch für Release. Wechseln sie dafür die Auswahl in der Kombobox und wie eben unter Linker in Eingabe reingehen. Auf der rechten Seite bei “Zusätzliche Abhängigkeiten” die Werte qtmain.lib QtGui4.lib QtCore4.lib einfügen.

Bevor wir fortfahren, wollen wir zuerst mit dem QT Designer eine *.ui Datei erstellen. Diese enthält das zu erzeugende Fenster in XML Form. Erzeugen sie mit dem Designer ein einfaches Mainwindow aus der Vorlage und speichern es als z.B. mywindow.ui in das Projektverzeichnis.

Danach gehen wir in die Projektmappe und fügen die eben erzeugte ui Datei in unsere Ressourcen. Das bewältigen wir mit einem einfachen Rechtsklick auf Ressourcen und Hinzufügen -> vorhandenes Element.

Da VS *.ui Dateien noch nicht kennt, müssen wir ihm sagen was er damit machen soll. Deshalb erzeugen wir eine Buildregel.

Beispiel:

Anzeigename: ui_regel
Dateiname:     ui_regel
Verzeichnis:   ..\..\Eigene Dateien\Visual Studio 2005\Regeln

Im gleichen Fenster klicken sie nun auf Buildregel hinzufügen. Im erscheinenden Fenster geben sie folgendes ein:

Befehlszeile:
$(QTDIR)/bin/uic.exe "$(InputPath)" -o ui_$(InputName).h
Dateierw.:  
*.ui
Name:
UI
Anzeigename:      
Kompiliere UI Datei (*.ui)
Ausführungsbe.:  
Erzeuge UI Datei ui\_\$(InputName).h
Ausgaben:
$(InputDir)ui_$(InputName).h

Solche Regeln sollten sie in ein Regelverzeichnis abspeichern und es VS verfügbar machen, damit es dauerhaft an der definierten Stelle nach Regeln suchen kann.

Extras -> Optionen -> Projekte und Projektmappen -> [VC++-Projekteinstellungen]

Auf der rechten Seite geben sie bei “Regeldatei-Suchpfade” das Verzeichnis an, wo VS nach Regeln suchen soll.

Beispiel Source

//main.cpp

#include <QApplication.h>
#include “mywindow.h”

int main(int argc,char **argv)
{
QApplication app(argc,argv);
mywindow win;
win.show();

return app.exec();
}

//mywindow.h
#pragma once
#include “ui_mywindow.h”

class mywindow :
public QMainWindow,Ui::MainWindow
{
Q_OBJECT
public:
mywindow(void);
~mywindow(void);
};

//myindow.cpp
#include “mywindow.h”

mywindow::mywindow(void)
{
setupUi(this);
}

mywindow::~mywindow(void)
{
}

MOC

Bevor das Projekt gelinkt werden kann, sollten sie voher den Meta Object Compiler über unsere Header-Dateien laufen lassen. Zur Zeit müssen wir dies über einen unangenehmen Weg machen. Wir müssen in die Eigenschaften der jeweiligen Datei rein um einen Buildschritt zu definieren.

Befehlszeile:
$(QTDIR)\bin\moc.exe “$(InputPath)” -o
“$(InputDir)moc_$(InputName).cpp”

Beschreibung:
moc läuft auf $(InputName).h

Ausgaben:
$(InputDir)moc_$(InputName).cpp

Nach Fertigstellung kompilieren sie die jeweilige Datei mit einem Rechtsklick über die Projektmappe. Nach der Kompilierung sollte in unserem Projektverzeichnis nun eine neue Datei erscheinen. Die neue e.g. moc_mywindow.cpp fügen wir unserem Projekt hinzu.

Erst jetzt kann das Projekt erfolgreich gelinkt werden.

Wichtig: Achtet bitte, dass sich die Gänsefüßchen von WordPress und VS unterscheiden.
Wenn ihr Teile aus diesem Artikel kopiert, achtet bitte auf die Gänsefüßchen.

Download:
http://www.megaupload.com/?d=N29TLMFM

http://rapidshare.com/files/233221115/myfirstproj.7z.html

Schlusswort

Anhand dieses Artikels müssten sie nun in der Lage sein, die Integration erfolgreich durchzuführen. Demnächst werde ich paar nützliche Addins vorstellen und den Schritt mit dem moc etwas erleichtern (mit PREmoc automatisieren). Ausserdem kommt noch ein Artikel über die Bibliothek qwt, welche man zum plotten von Graphen nutzen kann.

Referenzen

QT 4.x Integration in Visual Studio 2005

QTFORUM

~ by Ferhat Akgün on 14.July 2008.

29 Responses to “QT 4.4.0 + Visual Studio Integration”

  1. [...] Dazu habe ich zuerst die Quelltexte kompiliert, was dank QtBuilder relativ einfach war. Mit Hilfe dieses Tutorials gelang mir die Integration von Qt in Visual Studio. Meine ersten Gehversuche mit Qt machte ich dann [...]

  2. Vielen Dank für dieses Tutorial!!
    Ich habe viele stressige und langwierige Versuche auf dem Mac mit Qt hinter mir. Selbst qt4-mac port
    lief nicht wie gewünscht.

    Hab viele Tutorials zu XCode/Qt gemacht und auch Qt/Visua Studio. Aber immer gab es irgendwelche Fehler…nun mache ich dieses Tutorial Schritt für Schriit – bin gerade bei 1,5h nmake angekommen-
    und hoffe endlich es in mein Visual Studio 2008 Express einbinden zu können. Das ist ja eine Anleitung für 2005. Ich habe 2005 einfach in 2008 vertauscht. Bin mal gespannt ob es klappt.

    Nochmals vielen Dank!!

    PS: Ich habe mit Qbasic angefangen dann:
    Delphi,Profan,Visual Basic, Pascal,QBasic,Perl,
    Perl/Tk,Python probiert und nun C++/Qt
    auch ich hab 95-96 meinen ersten Rechner gehabt eine: 486-DX-2/66 mit 4 Ram ;)

    Liebe Grüße Timo

  3. Hi,

    es macht keinen Unterschied ob 2005 oder 2008.
    Falls es doch nicht klappen sollte, kannst es ja hier posten.

    Gruß

    Ferhat Akgün

  4. Hi, danke für das super Tutorial!
    Eine kleine Anmerkung noch: Den MOC Buildstep kann man auch als Regel schreiben =)

  5. Gleichfalls danke für dieses feine Tutorial. Mir ist gleich beim ersten Versuch die Installation geglückt.

    Ich habe nun beim Testen ein anderes Problem gefunden, für das ich noch keine Lösung habe. Vielleicht ist es einem der Poster hier schon untergekommen. (Aus den google-Ergebnissen bin ich nicht schlau geworden.)
    Beim run eines kompilierten Projekts im Visual Editor erhalte ich die Meldung “Diese Anwendung konnte nicht gestartet werden, weil QtGuid4.dll nicht gefunden wurde. …” Nun habe ich aber unter [-Eigenschaften-Allgemeine Eigenschaften-Framework und Verweise-Verweissuchpfade] brav $(QTDIR)\lib und $(QTDIR)\bin eingetragen. Aber das nützt nichts; nicht einmal, wenn ich den Pfad explizit ausgeschrieben dort eintrage. An beiden bezeichneten Stellen liegt jedoch ein Exemplar der gesuchten dll.
    Der freundliche zweite Teil der Fehlermeldung lautet “… Neuinstallation der Anwendung könnte das Problem beheben.” Das scheint mir nun etwas übertrieben.
    Die Empfehlungen, die ich bisher im Netz fand, laufen alle darauf hinaus, die gesuchten dll’s ins exe-Verzeichnis zu kopieren – aber das schmeckt mir nicht. Visual muß doch wohl in der Lage sein, die libraries zu finden, die dynamisch gelinkt werden sollen, wenn ihr Pfad angegeben ist.

    @CJ
    Deine Anmerkung interessiert mich. Wie muß der Identifikator definiert sein, der die Anwendung der Regel auslöst? Eine Dateierweiterung kann es ja wohl nicht sein.

    Grüße,
    KL

  6. Etwas Text ist verlorengegangen.
    Es muß heißen: Nun habe ich aber unter [(projectname)-Eigenschaften-Allgemeine Eigenschaften-Framework und Verweise-Verweissuchpfade] brav …

    Grüße,
    KL

  7. Einmal überschlafen hat geholfen.

    1. RTFM! – Wenn ich eine (dynamisch gelinkte) Dll zur runtime im Visual Editor zur Verfügung haben will, muß ich unter [(projectname)-Eigenschaften-Konfigurationseigenschaften-Debugging-Umgebung] den Pfad zur Dll eintragen.
    2. Wenn ich meiner exe zur runtime außerhalb des Visual Editors die dynamisch gelinkte Dll verfügbar machen will, muß sie unter %PATH% zu finden sein. Ganz klassisch. Also für Portierung ein Installer-Routine schreiben, die benötigte Dlls an die entsprechende Stelle auf der Anwendermaschine kopiert.
    3. Ich kann die Dll (vielleicht) statisch linken.

    Dank fürs Zuhören.

    Grüße,
    KL

  8. Zweimal überschlafen hilft offenbar noch mehr.

    @KL 24. September + @CJ Anmerkung MOC buildstep

    Habe es herausgefunden.
    Was mich irritierte, war die Steuerung der Regel über die Dateierweiterung. Ich will ja z. B. nicht alle *.h-Dateien dem moc-buildstep unterziehen. Hier war die Lösung, für die auszuschließenden Dateien in [Eigenschaften-Konfigurationseigenschaften-Allgemein] die Option “Vom Build ausschließen” zu bejahen.

    Bin sehr zufrieden, danke für die stille Moderation, fürs Zuhören und, wie gesagt, für das hilfreiche Tutorial.

    Grüße,
    KL

  9. Kein Problem ;)
    Bin in den letzten Wochen zu beschäftigt gewesen.
    Aus diesem Grund konnte ich nichts dazu schreiben.

    Die Probleme scheinen jetzt vom Tisch zu sein…

    Gruß
    Ferhat Akgün

  10. habe im code von //mywindow.h eine fehler entdeckt:
    es sollte #include “ui_mainwindow.h” lauten damit alles funktionert!

    aber sonst tolles Tutorial, hat mir sehr geholfen!

  11. //habe im code von //mywindow.h eine fehler //entdeckt:
    //es sollte #include “ui_mainwindow.h” lauten damit //alles funktionert!

    //aber sonst tolles Tutorial, hat mir sehr geholfen!

    Nicht unbedingt, die Klasse heißt bei mir mywindow.
    Deshalb ist “ui_mywindow.h” schon richtig.

    Gruß

    Ferhat Akgün

  12. Hallo Ferhat,
    habe wohl eben auf die falsche Seite geguckt, naja, jetzt hast Du 2 Danksagungen von mir…

    Prima Anleitung, ging alles glatt. Äh ich meine die Installation. Weiter noch nicht.

    Kann sein dass noch paar Anfängerfragen hinterherkommen…

    Grüße
    Lena

  13. Hallo Ferhat,
    ich habe beim Kompilieren Fehler:
    Fehler 1 error C2504: ‘QMainWindow’: Basisklasse undefiniert
    Fehler 2 error C2039: ‘MainWindow’: Ist kein Element von ‘Ui’
    Fehler3 error C2504: ‘MainWindow’: Basisklasse undefiniert
    Fehler 4 error C2039: ’show’: Ist kein Element von ‘mywindow’

    Obwohl ich alles so durchgeführt habe wie du es beschrieben hast. Würde mich freuen wenn du mir weiterhelfen kannst.
    Danke.
    lg gül

    • Hi Gül,

      deinem Projekt ist die Klasse QMainWindow unbekannt.
      Poste doch mal deine kompletten Quelldateien.

  14. Hallo Ferhat,
    ich habe das ganze mal nachgemacht, allerdings hatte ich den QT-designer schon drauf und ich benutze VS2008.

    Irgendwas mache ich mit dem moc falsch.
    Den Buildschritt habe ich wie beschrieben nachgebaut. nun gehe ich auf meine Header und kompiliere. Dabei kommt dieser Fehler zurück:
    moc läuft auf mywindow.h
    Das System kann den angegebenen Pfad nicht finden.
    Der Befehl “”c:\Dokumente und Einstellungen\marco\Eigene Dateien\Visual Studio 2008\Projects\myprojektqt\myprojektqt\moc_mywindow.cpp”" ist entweder falsch geschrieben oder
    konnte nicht gefunden werden.
    Project : error PRJ0019: Ein Tool hat einen Fehlercode aus folgender Quelle zurückgegeben: “moc läuft auf mywindow.h”
    Das Buildprotokoll wurde unter “file://c:\Dokumente und Einstellungen\marco\Eigene Dateien\Visual Studio 2008\Projects\myprojektqt\myprojektqt\Debug\BuildLog.htm” gespeichert.
    myprojektqt – 1 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Was mache ich falsch? bin noch ziemlicher Anfänger.
    danke schon mal im Voraus

    • Hi,

      ich habe mal eben paar Sachen in der Anleitung überarbeitet und ein Beispielprojekt angehangen.
      Hoffe es hilft dir…

      Gruß

      Ferhat

  15. Hi, ich hab ebenfalls ein paar probleme mit dem moc.

    1>Meta Object Compiler runs mywindow.h
    1>moc: Missing output file name
    1>Usage: moc [options]

    Aber in den Eigenschaften der mywindow.h steht unter “Configuartion Properties -> Costum Biuld Step->General->Outputs:”$(InputDir)moc_$(InputName).cpp”

    Hast du eine Idee was ich falsch gemacht haben koennte?

    Leider stehen die project files nicht mehr als download zur verfuegung.

    Gruss

    Stefan

    • Hi,

      ich habe das Beispielprojekt nochmal hochgeladen.
      Kannst es dir anschauen. Falls du immernoch Probleme haben solltest, melde dich erneut.

      Gruß

      Ferhat

      • Hi,
        also dein Project laeuft.

        Aber bei meine maekert er immer das er die QMainWindow nicht kennnt. Hab auch die Projekteinstellugn mit einander verglichen und es ist kein unterschied festzustellen.

        Hast du noch eine Idee?

        Danke
        Stefan

  16. http://rapidshare.com/files/234474050/MondayMorning.rar

    Danke schon mal

    • Ist normal, dass er QMainWindow nicht findet. Du verwendest ja auch kein QMainWindow sondern QDialog.
      Schau dir mal deine ui genau an.

      Gruß

      Ferhat Akgün

  17. Hallo zusammen,

    hoffe ihr könnt mir helfen…
    Bei mir klappt das Kompilieren von QT nicht.
    Hab mir das Paket “qt-x11-opensource-src-4.5.2.tar” runtergeladen und wollte es nach dieser Anleitung kompilieren.
    Hab es entpackt und die Umgebungsvariablen gesetzt. Müssten ja eigentlich gleich geblieben sein?
    Bei der Befehlseingabe
    “configure -platform win32-msvc2008 -no-qt3support”
    bekomme ich immer den Fehler, dass er den Befehl/Datei nicht kennt, obwohl sie im Verzeichnis ist.
    Hoffe ihr könnt mir helfen.
    Danke im Vorraus!

    • Hi,

      du hast eine falsche Version runtergeladen. Die X11 ist die Linux-Version.
      Auf der Download-Seite von Trolltech ist die Kennzeichnung eigentlich recht gut.

      PS.: Mittlerweile gibt es auch eine komplette IDE von QT.

      Gruß,
      Ferhat Akgün

  18. Hallo,

    danke für die schnelle Antwort. Hab eigentlich nicht damit gerechnet, dass diese Seite noch oft besucht wird, nachdem die letzen Meldungen im May waren.
    Hab damals Qt mit google gesucht und einfach des aktuellste runtergeladen ohne auf die Kennzeichnung zu achten. War schon richtig verzweifelt an was es liegt.
    Vielen Dank für die Hilfe!

    Gruß
    Matthias

  19. Hallo

    Ich schreib mal in der Hoffnung, dass die Seite noch nicht zu alt ist.
    Tausend Dank für die Anleitung – hilft echt unglaublich weiter. Leider kompiliert bei mir die header-Datei nicht. Wie darf ich mir denn die Zeile

    #include “ui_mywindow.h”

    erklären? wie komms du auf ‘ui_mywindow.h’?, das versteh ich nicht.

    Ich bekomme beim Kompilieren der header-Datei der Klasse den folgenden Fehler:

    Fehler 1 error PRJ0019: Ein Tool hat einen Fehlercode aus folgender Quelle zurückgegeben: “moc läuft auf mywindow.h” Hello world Hello world

    Für Hilfe bedanke ich mich ganz herzlich!
    – Mathias Bader

    • Hi Mathias,

      in dem Beispielprojekt habe ich eine mywindow.ui im designer erzeugt. Wenn nun diese vom user interface compiler (uic.exe) verarbeitet wird, entsteht eine ui_mywindow.h. (siehe unten)

      Hast wohl diesen Schritt überflogen.
      $(QTDIR)/bin/uic.exe “$(InputPath)” -o ui_$(InputName).h

      Gruß,
      Ferhat Akgün

      • Hallo Ferhat

        Erstmal vielen Dank für deine Antwort. Ich hab den Fehler gefunden – und zwar hab ich die Zeile

        $(QTDIR)\bin\moc.exe “$(InputPath)” -o
        “$(InputDir)moc_$(InputName).cpp”

        als zwei Zeilen eingetragen, wie hier auf der Webseite. Es muss aber mit Leerzeichen dazwischen in eine Zeile geschrieben werden (wird wohl hier einfach nur umgebrochen). Jetzt funktioniert es – bin sehr happy :-) .

        Nochmal vielen, vielen Dank – dein Tutorial war eine sehr große Hilfe.

        – Mathias

  20. Hi,

    kannst du mal dein Projekt hochladen, damit ich es mir anschauen kann.

  21. Hi Mathias,

    danke für den Hinweis. Da hast du recht. Ich werde es gleich mal korrigieren ;)

    Gruß,

    Ferhat

Leave a Reply