UIC ignoriert Basisklasse

Alles rund um die Programmierung mit Qt
Antworten
axw
Beiträge: 3
Registriert: 10. Dezember 2008 15:49

UIC ignoriert Basisklasse

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
axw
Beiträge: 3
Registriert: 10. Dezember 2008 15:49

Beitrag 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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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!
Antworten