# QT 4.0.1 Probleme beim kompilieren von einer UI Datei vom Designer



## GandalfMobil (16. Oktober 2005)

Hallo Leute,

langsam stellt sich bei mir eine gewisse Frustration ein, weil ich jetzt schon seit mehreren Tagen an diesem Problem arbeite und irgendwie mich nur im Kreis dreh.

Also folgende Ausgangssituation:
- Mac OS X Tiger mit QT 4.0.1 Open Source mit dem Designer 4.0.1
- Alle Export Paths etc sind eingestellt und QT ist komplett richtig kompiliert und installiert worden nach /usr/local/Trolltech/QT 4.0.1/

Folgendes funktioniert ohne Probleme:

```
#include <QApplication>
    #include <QPushButton>

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);

        QPushButton hello("Hello world!");
        hello.resize(100, 30);

        hello.show();
        return app.exec();
    }
```

speichere dieses als main.cpp und mache dann 
qmake -project
qmake
make

danach
open tutorial.app/

und schon läuft es, also würde ich sagen das die Bibliotheken und alles richtig installiert sind und qt eigentlich richtig kompiliert.

Nun wollte ich nicht eine ganze GUI mit Hand programmieren, sondern mit dem Designer. In der 3.0 Version gab es die Möglichkeit mit dem Designer ein ganzes Projekt zu erstellen, dass auch automatisch die main.cpp usw erzeugt hat. Das macht QT 4.0 die kostenlose Open Source Version scheinbar nicht mehr.

Ich starte den Designer und wähle Main Window aus. Dieses leere Fenster lasse ich so und speicher es ab unter File/Save Form as und nenne die Datei test.ui und speichere sie in dem Ordner ...../test ab.

Im Designer im Property Editor stehene folgende Informationen :
QObject : object Name : MainWindow
und im Object Inspector :
MainWindow (Obejct) : QMainWindow(class)
centralWidget(Object) : QWidget(class)

Nun gehe ich in die Shell und gehe in den Ordner test. Dort habe ich zur Zeit nur die eine test.ui die ja im XML Style gespeichert ist. Nun kann ich mit Hilfe von uic aus der UI Datei eine Header Datei machen:
uic -o test.h test.ui
Diese test.h sieht folgendermaßen aus:

```
#ifndef TEST_H
#define TEST_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QMainWindow>
#include <QtGui/QWidget>

class Ui_MainWindow
{
public:
    QWidget *centralWidget;

    void setupUi(QMainWindow *MainWindow)
    {
    MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->resize(QSize(800, 600).expandedTo(MainWindow->minimumSizeHint()));
    centralWidget = new QWidget(MainWindow);
    centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
    MainWindow->setCentralWidget(centralWidget);
    retranslateUi(MainWindow);

    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(MainWindow);
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

#endif // TEST_H
```

nun brauche ich noch eine main.cpp Datei. Diese Datei habe ich aus dem Internet von Trolltech gefunden und die soll so aussehen:

```
#include <QApplication>
#include "test.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QMainWindow widget;
    widget.show();
    return app.exec();
}
```

Danach erstelle ich mit qmake -project das test.pro File

```
TEMPLATE = app
TARGET +=
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += test.h
FORMS += test.ui
SOURCES += main.cpp
```

danach mit qmake das Makefile erzeugen und mit make kompilieren

wenn ich dann das Programm starte kommt ein leeres Fenster aber nicht in der Größe, das ich angegeben hatte. Auch wenn ich Buttons oder so hinzufüge, bleibt das Fenster immer leer. Auch wenn ich im Deisgner die Größe veränder, passiert nichts.

Nun ist meine Idee, dass der Fehler in der main.cpp liegt, weil ich da
QMainWindow widget;
aufrufe. QMainWindow ist doch der Klassenname und widget das Objektname. Nun habe ich anstall QMainWindow auch mal QWidget ausprobiert, ging aber auch nicht.

Ich habe auch schon sämtliche Dokumente von Trolltech gelesen, aber es läuft irgendwie nicht.

Hat jemand von euch vielleicht eine Idee ?

Viele Grüße von
Hauke

PS: Danke schonmal !


----------



## Daniel Toplak (16. Oktober 2005)

Hi also eine Idee direkt hab ich nicht aber was mir auffällt ist folgendes:
in deiner generierten Header datei hast du eine Klasse 

```
class MainWindow: public Ui_MainWindow {};
```
Das scheint wohl dein Hauptfenster zu sein, aber in deiner main.cpp definierts du:

```
QMainWindow widget;
```
sollte das dann nicht so heissen?

```
MainWindow widget;
```
Ansonsten würdest du ja eine Basis.Fensterklasse von QT instanzieren.
Prüf das mal. 

Sonst fällt mir noch auf, dass in deinem Header die Größe festgelegt wird:

```
MainWindow->resize(QSize(800, 600).expandedTo(MainWindow->minimumSizeHint()));
```
Ändert sich das, wenn du im Designer andere Werte verwendest?

Das sind nur Vermutungen von mir, aber vielleich hilfts ja.

Daniel


----------



## GandalfMobil (18. Oktober 2005)

Hi,

danke für deine Antwort und hier leider die traurigen Ergebnisse deiner Ideen :

Wenn ich aus QMainWindow -> MainWindow mache kommt bei "make" folgender Fehler:


```
c++ -c -pipe -g -Wall -W -F/usr/local/Trolltech/Qt-4.0.1/lib -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.0.1/mkspecs/macx-g++ -I. -I/usr/local/Trolltech/Qt-4.0.1/lib/QtGui.framework/Versions/4.0/Headers -I/usr/local/Trolltech/Qt-4.0.1/lib/QtCore.framework/Versions/4.0/Headers -I/usr/local/Trolltech/Qt-4.0.1/include -I. -I. -I. -o main.o main.cpp
main.cpp: In function `int main(int, char**)':
main.cpp:7: error: 'MainWindow' was not declared in this scope
main.cpp:7: error: expected `;' before "widget"
main.cpp:8: error: 'widget' was not declared in this scope
make: *** [main.o] Error 1
```

Wenn ich in der Header Datei die Windows Size von 800 x 600 auf 20 x 20 ändere und es auf QMainWindow lasse, lässt er die Größe wie vorher, also instanziert der ein neues Default Window Widget. Nur die Frage ist warum ? Wenn ich nun im Designer eine neue ui datei erstellen lasse, in der die Fenstergröße vom Standart abweicht, steht auch diese Größe nach uic -o ...... in der Header Datei. Also die Konvertierung mit uic -> Header File funktioniert gut.

Hat jemand noch eine Idee? Ist bestimmt doch nur eine Kleinigkeit, so wie ich mir das vorstelle.

Vielen Dank schonmal.
Mfg Hauke


----------



## Daniel Toplak (18. Oktober 2005)

Hi,
ui sorry da hab ich was vergessen, du definierst das ja innerhalb eines namespaces, also müsste deine main so aussehen:

```
#include <QApplication>
#include "test.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Ui::MainWindow widget;
    widget.show();
    return app.exec();
}
```

Gruß Daniel


----------



## GandalfMobil (19. Oktober 2005)

Hi,

so langsam komme ich der Sache näher. Nun kommt folgende Fehlermeldung, wenn ich deine main.cpp benutze. Ich habe auch vorsichtshalber noch sämtliche Header Files in der main.cpp included, die im header included werden.


```
c++ -c -pipe -g -Wall -W -F/usr/local/Trolltech/Qt-4.0.1/lib -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.0.1/mkspecs/macx-g++ -I. -I/usr/local/Trolltech/Qt-4.0.1/lib/QtGui.framework/Versions/4.0/Headers -I/usr/local/Trolltech/Qt-4.0.1/lib/QtCore.framework/Versions/4.0/Headers -I/usr/local/Trolltech/Qt-4.0.1/include -I. -I. -I. -o main.o main.cpp
main.cpp: In function `int main(int, char**)':
main.cpp:13: error: 'class Ui::MainWindow' has no member named 'show'
make: *** [main.o] Error 1
```


----------



## kventil (12. Juli 2007)

Aloa

das Problem ist schlicht und ergreifend, dass du bei der mit dem Qt-Designer erstellten Klasse keine show hast... bzw. sie sich selber kein eigenes Fenster erstellt. Anstatt dessen musst du eines selber erstellen und dieses dann an deine Klasse mit der Funktion setupUI übergeben.


```
QMainWindow widget;
Ui_MainWindow test;
test.setupUi(&widget);
widget.show();
return app.exec();
```


Hatte das Problem bis gerade eben auch ;-) (darf das ganze gerade für ein Studienbezogenes Semesterprojekt machen ;-))


----------

