Seite 1 von 1

UIC ignoriert Basisklasse

Verfasst: 10. Dezember 2008 16:27
von axw
Hallo!

Ich habe auch nach längerem Suchen keine Lösung für folgendes Problem gefunden:

Ich erstelle ein einfaches MainWindow mit dem Designer.
Ich prozessiere die Ui-Datei mit dem UIC.
Nun enthält die entstehende Klassendeklaration keine Angabe zur Basisklasse meines Widgets, folglich kompiliert der Rest nicht.
Früher (Qt 3.2 habe ich glaube ich zuletzt benutzt, ist schon länger her...) hat das funktioniert. Jetzt muss ich die Basisklasse in das Header-File von Hand eintragen, damit das Projekt kompiliert. Das kann ja aber nicht Sinn der Sache sein, weil das Ding nach jeder Änderung neu erstellt wird. Weiss dazu jemand eine Lösung? Oder habe ich einen neuen Bug gefunden (Stolz...)?

Ich verwende folgendes System:
Windows XP SP3
QT4.4.3 Open Source Edition
MS VS 2008

Die Custom Build Rules habe ich richtig angelegt, aber das spielt hier keine Rolle, denn auch manuell entsteht der gleiche Fehler.
Qt habe ich selbst kompiliert, falls das einen Einfluss haben sollte.

Anbei Ausschnitte des Codes. Erst das ui-File:

Code: Alles auswählen

<ui version="4.0" >
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow" >
  <property name="geometry" >
...
   <rect>
Da ist also die Basisklasse richtig angegeben. Auch das #include stimmt nachher im Header-File:

Code: Alles auswählen

** Form generated from reading ui file 'mainwindow.ui'
**
** Created: Wed 10. Dec 15:41:15 2008
**      by: Qt User Interface Compiler version 4.4.3
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

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

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QMenuBar *menubar;
später im Code dann die Deklaration des namespaces:

Code: Alles auswählen

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui
Ich weiß zwar nicht wozu, aber ok, ist auch egal, ob ich die Ui_-Klasse nutze oder die ohne. Im einen Fall benutze ich natürlich auch den namespace...

Hier dann der Compiler-Fehler:

Code: Alles auswählen

error C2664: QApplication::setActiveWindow: Konvertierung des Parameters1 von Ui::MainWindow * in QWidget * nicht möglich.
Dieser Aufruf steht in meiner WinMain-Funktion.

Ein einfaches Ableiten von QMainWindow (public) löst das Problem wie gesagt.

Weiss jemand eine Lösung?
Ciao und vielen Dank,

axw

Verfasst: 10. Dezember 2008 16:55
von Christian81
Wenn Du nicht von QWidget ableitest kann es auch nicht funktionieren, oder? Zwischen Qt3 und Qt4 hat sich an dieser Stelle schon einiges getan --> http://doc.trolltech.com/4.4/designer-u ... onent.html

Verfasst: 10. Dezember 2008 17:18
von axw
Interessant!

Da hat sich wohl wirklich einiges getan. Das Problem scheint gelöst, auch wenn die Geschichte etwas dubios ist, ganz verstanden hab ich das neue Konzept noch nicht. Na gut, jedenfalls vielen Dank!
Bin mal gespannt, welche Überraschungen mich hier noch erwarten...

Ciao, axw.

Verfasst: 11. Dezember 2008 07:11
von AuE
setActiveWindow: Konvertierung des Parameters1 von Ui::MainWindow * in QWidget * nicht möglich.
Das Ding ist das deine Klasse nicht von QWidget erbt. Somit kannst du an setActiveWindow deine Klasse nicht übergeben. Die Funktion erwartet ein QWidget.
Leitest du deine Klasse von der QWidget Klasse ab so macht der compiler quasi einen cast deiner Klasse in ein QWidget und es geht.
Du kannst ja auch eine Funktion die einen int erwartet nicht mit einen double aufrufen, oder? aber wenn den double castest geht es!