Seite 1 von 1

[gelöst]2ter Dialog, seltsame Fehlermeldung

Verfasst: 17. März 2010 20:44
von textmitfunktion
Hallo,

auch eigentlich eine newbie-Frage denke ich mal.

Ich will meiner Anwendung einen 2ten Dialog zuschalten (durch klick auf Menüpunkt).

Ich hab es versucht über die single-inheritance-approach:
http://qt.nokia.com/doc/4.5/designer-us ... e-approach.
Dazu habe ich über QCreator und QDesigner *.ui & *.h Datei erzeugen lassen und aus dem Tutorial die Zeilen eingebaut. Beim compile meckert er jedoch in Datei *.h :

Code: Alles auswählen

*.h:19: error: 'SettingsForm' in namespace 'Ui' does not name a type
in der Zeile die im Tutorial so lautet:

Code: Alles auswählen

 
private:
     Ui::CalculatorForm ui;

Und die ich in meiner App natürlich von "CalculatorForm" zu "SettingsForm" angepasst habe.

Nochwas, in der *.h meiner Hauptapplikation steht noch der folgende Teil. Hat es damit etwas auf sich? Im Tutorial taucht das nicht auf. Und meine versuche das in meinem neuen Dialog reinzufrimeln sind nicht gefruchtet.

Code: Alles auswählen

namespace Ui {
    class checkini;
}
viele Grüße

Verfasst: 17. März 2010 23:41
von textmitfunktion
OK,

Code: Alles auswählen

namespace Ui {
    class SettingsForm;
}

War es doch. Das hab ich jetzt in meine *.h eingefügt. Der Fehler kommt nicht mehr. Jetzt meckert der compiler nur noch an einer Stelle! (wow :D )
Nämlich in der Klassendefinition der Klasse "SettingsForm"

Code: Alles auswählen

 private:
     Ui::SettingsForm ui;
mit den Worten:

Code: Alles auswählen

settings.h:22: error: field 'ui' has incomplete type
wenn ich aus meiner MainApplikation klaue das die dort an der selben Stelle ui als einen Pointer setzen, nämlich so:

Code: Alles auswählen

 private:
     Ui::SettingsForm *ui;
kommt nur wieder eine andere Meldung:

Code: Alles auswählen

main.cpp:32: error: request for member 'setupUi' in '((SettingsForm*)this)->SettingsForm::ui', which is of non-class type 'Ui::SettingsForm*'
beim Aufruf in der MainAplication

Verfasst: 18. März 2010 07:57
von archer
Hallo,
die Vorwärtsdeklaration

Code: Alles auswählen

namespace Ui {
    class SettingsForm;
}
geht nur bei Referenzen und Zeigern.
Wenn du in einer header die Definition

Code: Alles auswählen

 private:
     Ui::SettingsForm *ui; 
hast, kannst du die Vorwärtsdeklaration machen. Dann mußt du aber in der cpp Datei auch ein #include setzen:

Code: Alles auswählen

#include "ui_SettingsForm.h"
Das ist der Name der Header-Datei die aus dem ui-File entstanden ist. Kann bei die natürlich auch anders heißen.
Außerdem im im Konstrukter:

Code: Alles auswählen

ui = new Ui::SettingsForm;
ui->setupUi(this);

Verfasst: 18. März 2010 18:13
von textmitfunktion
Hi Archer, Danke für Deine Mühe.

Bis zur folgenden Zeile hab ic halles so wie Du sagtest schon und das Programm murrt nicht herum beim compilieren. Aber sobalt ich Dein:

Code: Alles auswählen

SettingsForm::SettingsForm(QWidget *parent) :
    QWidget(parent)
{
    //ui.setupUi(this);
    ui = new Ui::SettingsForm;
    ui->setupUi(this);
}
 
In meiner *.cpp der Hauptapplikation einfüge meint er:

Code: Alles auswählen

checkini.cpp:32: error: invalid use of incomplete type 'struct Ui::SettingsForm'
Muss ich ein eigene *.cpp dafür anlegen und die in meiner applikation.cpp einbinden?
Und ist es Problematisch das zwei mal Ui in der gleichen *.cpp eingebunden werden ?

Code: Alles auswählen

//MainFunction starts //
checkini::checkini(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::checkini)
{
    ui->setupUi(this);
    createActions();
    createMenus();
}

checkini::~checkini()
{
    delete ui;
}

SettingsForm::SettingsForm(QWidget *parent) :
    QWidget(parent)
{
    //ui.setupUi(this);
    ui = new Ui::SettingsForm;
    ui->setupUi(this);
}
vielen Dank

Verfasst: 19. März 2010 09:22
von archer
Also bei mir besthet ein Dialog immer aus einer header-Datei und einer cpp-Datei und bei Bedarf noch aus einer ui-Datei.

So ganz vestehe ich auch nicht was du eigentlich gemacht hast.
Mein Vorschlag:
Mach deinen checkini-Dialog mit einer eigene h, cpp und ui und deinen SettingsForm-Dialog ebenfalls mit einer eigenen h, cpp und ui.
Das schafft Übersicht und ist Sauber.

Verfasst: 19. März 2010 09:51
von textmitfunktion
archer hat geschrieben:Also bei mir besthet ein Dialog immer aus einer header-Datei und einer cpp-Datei und bei Bedarf noch aus einer ui-Datei.
Bei mir auch.
In meiner MainApp hab ich alles soweit es ging im QCreator und QDesigner per wizard erstellen lassen und nur noch meine Funktionen in die GUI eingebaut.

Den 2ten Dialog hab ich nicht durch den Wizard erstellen lassen (das werd ich heute Abend nochmal probieren), sondern durch rechtsklick auf das ui file und dort dann "hinzufügen" ausgewählt. das Gleiche für die .h und .cpp Datei.
So ganz vestehe ich auch nicht was du eigentlich gemacht hast.
Mein Vorschlag:
Mach deinen checkini-Dialog mit einer eigene h, cpp und ui und deinen SettingsForm-Dialog ebenfalls mit einer eigenen h, cpp und ui.
Das schafft Übersicht und ist Sauber.
So habe ichs ja. Ich hab beim 2ten Dialog immer versucht mich genau an die Stucktur zu halten wie der Wizard sie für meine MainApp erzeugt hat.

Naja, ich Danke Dir auf jeden Fall erstmal. Und probiere es Abend nochmal mit dem Wizard. Wenn das nichts bringt. setzt ich mein Projekt mal hier rein. :)

VG

Verfasst: 19. März 2010 09:58
von archer
Hat den deine SettingsForm, d.h. die ui, auch den Objektnamen (nicht der Dateiname) SettingsForm bekommen?

Verfasst: 19. März 2010 12:26
von textmitfunktion
Hm, gute Frage. Wo stellt man das ein? Ich habs glaube ich nicht explizit angegeben.

Edith: ..hab ich jetzt gefunden. Es hieß noch "Form"

EXIT

Verfasst: 19. März 2010 20:00
von textmitfunktion
Ich glaub ich gebe gleich auf :-/ "allet Scheisse" .. hät ich fast gesagt. Ich glaub mal ich hab jetzt alles an dem Projekt kaputt gespielt.

Könnte bitte jemand mal eine kurze verbale Beschreibung abgeben welche Schritte einzeln nötig sind um zu meiner funktionierenden Application einen weiteren Dialog hinzuzufügen? Die Hauptapplication hat bereits eine .ui eine .h und 2 .cpp Dateien. Eine davon ist meine checkini.cpp und die andere ist die main.cpp vom Wizard in der nur folgendes steht:

Code: Alles auswählen

#include <QtGui/QApplication>
#include "checkini.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    checkini w;
    w.show();
    return a.exec();
}
Oder gibts schon dieses Howto oder Tutorial nach dem ich suche? (Weil ich hab in den letzten Tagen keines gefunden. Entweder beziehen die sich nur auf einen Dialog oder es wird im Rahmen eines großen Projektes ein zweiter Dialog erzeugt wo ich aber nicht mehr durchsehe wie ich das auf mein Projekt adaptieren kann)

Ich verwende übrigens: Qt SDK for Windows, mit Creator 1.3.1 und QT 4.6

Danke und viele Grüße

Verfasst: 19. März 2010 20:57
von Christian81
Ein zweiter Dialog wird genauso erstellt wie der erste. Den Namen des Dialogs (und damit auch den Variablennamen mit dem man den Dialog anspricht) stellt man im Designer ein (Objektname des Dialogs).

Verfasst: 20. März 2010 23:18
von textmitfunktion
YEAH! Endlich.

Ich hatte das selbe Problem wie der hier:
http://www.qtforum.de/forum/viewtopic.php?t=8561

in der single-inheritance-approach ist die Rede von QWidget aber bei Dialogen muss man QDialog verwenden.
Klingt logisch, aber muss man erstmal drauf kommen. :roll:

merci