www.mikrocontroller.net

Forum: PC-Programmierung ui in cpp einbinden


Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mit Qt eine einfache Oberfläche mit einem Textfeld erstellt.
nun will ich aber mit code::blocks diese datei (.ui) einbinden und 
ändern.
Es kommt aber immer ein Fehler. :-(
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <iostream>
#include "ui_test3.h"

using namespace std;

 namespace Ui {

class test3 : public QWidget
 {
     Q_OBJECT

 public:
     test3(QWidget *parent = 0);

 private slots:
     void on_inputSpinBox1_valueChanged(int value);
     void on_inputSpinBox2_valueChanged(int value);

 private:
     Ui::test3 ui;  
  };

 }

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



   QApplication app(argc, argv);
   QWidget *widget = new QWidget;
   Ui::Test3 ui;
   ui.setupUi(widget);

   widget->show();
   return app.exec();

}

Fehlermeldung

main.cpp|22|error: field 'ui' has incomplete type|
main.cpp||In function 'int qMain(int, char**)':|
main.cpp|39|error: 'Test3' is not a member of 'Ui'|
main.cpp|39|error: expected `;' before 'ui'|
main.cpp|40|error: 'ui' was not declared in this scope|
||=== Build finished: 4 errors, 12 warnings ===|

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du auch auf die Groß- und Kleinschreibung geachtet?

Sieht nicht so aus.

test3 schreibst Du in der Klassendeklaration klein, in der Verwendung 
aber groß.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
class test3 : public QWidget
 {
     Q_OBJECT

 public:
     test3(QWidget *parent = 0);

 private slots:
     void on_inputSpinBox1_valueChanged(int value);
     void on_inputSpinBox2_valueChanged(int value);

 private:
     Ui::test3 ui;  
  };


Aha. Ein test3 Objekt enthält also ein test3 Objekt, welches seinerseits 
wieder ein test3 Objekt enthält welches dann auch wieder ein test3 
Objekt enthält (tief Luft hol), das dann auch wieder ein test3 Objekt 
enthält, welches ein test3 Objekt als Member hat, ....

Merkst du was?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O ja, das ist besonders drollig. Was mag wohl sizeof dazu sagen?

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger
Was ist daran so ungewöhnlich, habe den code aus einem beispiel aus der 
online hilfe von qt übernommen.
Ich weiss nicht was ich falsch mache.

test3 ist jetzt überall klein geschrieben.

Gruß
Andre

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andre schrieb:
> @Karl heinz Buchegger
> Was ist daran so ungewöhnlich, habe den code aus einem beispiel aus der
> online hilfe von qt übernommen.
> Ich weiss nicht was ich falsch mache.

Du versuchst ein Objekt zu erzeugen, welches unendlich groß ist!

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie mache ich es denn richtig? eine kleine hilfestellung wäre nett.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal dein Beispiel her.

Ich wette der Fehler besteht darin, dass du deine eigene Klasse 
ebenfalls in den Namespace UI gelegt hast.

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include "ui_calculatorform.h"

 class CalculatorForm : public QWidget
 {
     Q_OBJECT

 public:
     CalculatorForm(QWidget *parent = 0);

 private slots:
     void on_inputSpinBox1_valueChanged(int value);
     void on_inputSpinBox2_valueChanged(int value);

 private:
     Ui::CalculatorForm ui;
 };

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QWidget *widget = new QWidget;
     Ui::CalculatorForm ui;
     ui.setupUi(widget);

     widget->show();
     return app.exec();
 }

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und das ist das gleiche Problem:
 private:
     Ui::CalculatorForm ui;
 };

Das ist das Ende der Deklaration der Klasse Ui::CalculatorForm. Und 
damit deklarierst Du eine Membervariable namens "ui" vom Typ 
Ui::CalculatorForm, also genau dem Typ, von dem die gerade deklarierte 
Klasse ist.

Wenn eine Klasse eine Membervariable vom gleichen Typ wie sie selbst 
enthält, dann ist das Rekursion.

Das mit dem Namespace macht die ganze Sache nur unübersichtlicher, 
ändert aber nichts am Hauptproblem:
class xyz
{
public:
  xyz();
  ~xyz();

protected:
  xyz uvw;
};

Das ist dasselbe in Grün.

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soory, aber ich komme icht weiter.
Hat jemand ein bespiel das ich 1 ein zu eins in mein umgebung einfüge 
kann ohne irgendwelche spezifischen Syntaxänderungen.

Nutze qt4.5
code::blocks
gnu ccc compiler

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Und das ist das gleiche Problem:
>
>  private:
>      Ui::CalculatorForm ui;
>  };
> 
>
> Das ist das Ende der Deklaration der Klasse Ui::CalculatorForm. Und
> damit deklarierst Du eine Membervariable namens "ui" vom Typ
> Ui::CalculatorForm, also genau dem Typ, von dem die gerade deklarierte
> Klasse ist.

Nicht ganz.
Diese Member ist vom Typ Ui::CalculatorForm.
Seine eigene CalculatorForm ist aber im globalen Namespace.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andre schrieb:
> Soory, aber ich komme icht weiter.
> Hat jemand ein bespiel das ich 1 ein zu eins in mein umgebung einfüge
> kann ohne irgendwelche spezifischen Syntaxänderungen.

Wie schon gesagt:
Dein Fehler war, dass du deine eigene test3 Klasse in den UI Namespace 
gelegt hast.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sollte es besser gehen
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <iostream>
#include "ui_test3.h"

using namespace std;

class test3 : public QWidget
{
     Q_OBJECT

 public:
     test3(QWidget *parent = 0);

 private slots:
     void on_inputSpinBox1_valueChanged(int value);
     void on_inputSpinBox2_valueChanged(int value);

 private:
     Ui::test3 ui;  
};

int main(int argc, char* argv[])
{
   QApplication app(argc, argv);
   QWidget *widget = new QWidget;
   test3 ui;
   ui.setupUi(widget);

   widget->show();
   return app.exec();
}


zumindest compilermässig. Ob es funktioniert, kann ich mangels QT nicht 
sagen.

Und lies in deinem Stroustroup nach, was es mit Namespaces auf sich hat.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Rufus t. Firefly schrieb:
>> Und das ist das gleiche Problem:
[schnipp]

> Nicht ganz.
> Diese Member ist vom Typ Ui::CalculatorForm.
> Seine eigene CalculatorForm ist aber im globalen Namespace.

Du hast --natürlich-- recht.

Könnte es sein, daß diese Art der Programmierung ein fitzelkleines 
bisschen fehlerträchtig und vielleicht auch ein winziges bisschen 
unübersichtlich ist?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:

> Könnte es sein, daß diese Art der Programmierung ein fitzelkleines
> bisschen fehlerträchtig und vielleicht auch ein winziges bisschen
> unübersichtlich ist?

LOL.
Das -- könnte -- allerdings sein.

(Qt hat mich auch schon an den Rand des Wahnsinns getrieben. Speziell 
der Resource-Editor erzeugt bei mir regelmässig Blutrausch :-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Ja, ich oute mich. Als Qt-Nichtbenutzer. Wenn das da beispielhaft für 
Qt ist, dann wird es wohl auch dabei bleiben.)

Autor: Käpt'n Fjutscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Echte Männer verzichten auf ui und coden ihr Layout in Qt selbst :o)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> (Ja, ich oute mich. Als Qt-Nichtbenutzer. Wenn das da beispielhaft für
> Qt ist, dann wird es wohl auch dabei bleiben.)

Na, so schlimm ist es nicht.

Da gibt es einen Resource Editor, der für jeden Dialog eine Klasse im Ui 
Namespace anlegt.
Deinen eigenen Dialog legst du selber an, leitest ihn (ich glaube es war 
eh von QWidget ab), verpasst ihm das Member aus dem Ui Namespace mit dem 
gleichen Namen und im Grunde wars das dann auch schon.
Fast: Dann geht das Gedöns los, wie man die ganzen Files ins Dev Studio 
reinbringt (da ich weiß, dass du Dev Studio benutzt).

Geht alles nach Schema F.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (da ich weiß, dass du Dev Studio benutzt)
Tu ich zwar, aber mit --igitt-- der MFC.

Hab' ich mir nicht ausgesucht, ist historisch gewachsen. Mein erstes 
größeres MFC-Projekt habe ich vor 14 Jahren verbrochen ... und muss es 
nach wie vor gelegentlich warten.

Als Alternative habe ich mir mal wxWidgets ausgeguckt, das scheint 
konzeptionell nicht völlig anders gelagert zu sein als die MFC, ist aber 
wohl erheblich orthogonaler.

Der Leidensdruck ist bislang noch nicht so groß; ich habe mich erst vor 
etwa einem Jahr final vom Developer Studio 6 getrennt (und alle 
Zwischenstufen bis vor 2008 übersprungen).

Naja, und wenn ich mich wirklich arg langweilen sollte, werde ich mir 
Objective-C näher ansehen, da das die Haus- und Hof-sprache der von mir 
privat zunehmend genutzten Systeme ist.

Ich schweife ab ...

> Da gibt es einen Resource Editor [...]
> Deinen eigenen Dialog legst du selber an, [...]
> verpasst ihm das Member aus dem Ui Namespace mit dem
> gleichen Namen und im Grunde wars das dann auch schon.

Das klingt immerhin auch irgendwie verständlich. Wenn man das aber 
unvorbereitet sieht, erschrickt man, weil es ziemlichem Quark ähnlich 
sieht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:

> Der Leidensdruck ist bislang noch nicht so groß; ich habe mich erst vor
> etwa einem Jahr final vom Developer Studio 6 getrennt (und alle
> Zwischenstufen bis vor 2008 übersprungen).

Ich habs immer noch (unter anderem).
(PSt nicht weiter sagen: Ich fühl mich eigentlich recht wohl damit)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(zunehmend OT)
Der C- und vor allem der C++-Compiler der neueren Version scheint um 
Größenordnungen besser geworden zu sein, und der Debugger gefällt mir 
auch besser; hier insbesondere die Fähigkeit des Remote Debugging mit 
"Andocken" an bereits laufende Prozesse. Das ist für meine Arbeit doch 
recht wichtig und hat mir den Abschied von VC6 leichtgemacht.
Allerdings ist der "Class Wizard" und das zugehörige Geraffel eher ein 
Rückschritt, und ob mir die schon wieder komplett anders aufgebaute 
Online-Hilfe wirklich gefallen mag, das weiß ich auch nicht.

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:

> Als Alternative habe ich mir mal wxWidgets ausgeguckt, das scheint
> konzeptionell nicht völlig anders gelagert zu sein als die MFC, ist aber
> wohl erheblich orthogonaler.

WxWidgets ist anders als MFC, nur die Schnittstelle sieht ähnlich aus. 
Es ist für mich die Cross-Plattform-Bibliothek der Wahl, weil 
ausgereift, umfangreich und gleichzeitig sehr schlank. Und für viele 
Plattformen verfügbar.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Nicht ganz.
>> Diese Member ist vom Typ Ui::CalculatorForm.
> Seine eigene CalculatorForm ist aber im globalen Namespace.
>
> Du hast --natürlich-- recht.
>
> Könnte es sein, daß diese Art der Programmierung ein fitzelkleines
> bisschen fehlerträchtig und vielleicht auch ein winziges bisschen
> unübersichtlich ist?

Warum Qt hier einen namespace verwendet, weiß ich auch nicht. Aber den 
ui-Typ gibt's auch unter dem Namen "Ui_CalculatorForm" ohne Namespace. 
Abgesehen davon kann man sich den Namen der Klasse natürlich selbst 
aussuchen, und es ist ja nicht der Qt anzulasten, wenn der 
Programmierer hier Namen wählt, mit denen er sich selbst austrickst.


> Echte Männer verzichten auf ui und coden ihr Layout in Qt selbst :o)

Noch echtere Männer benutzen ui-Files, aber erzeugen sie mit vi ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:

> Noch echtere Männer benutzen ui-Files, aber erzeugen sie mit vi ;-)

Der Himmel steh uns bei!

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler ist mehr noch genau der gleiche.
Gruß
Andre

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Fehlermeldungen passen nicht zum Code.

> main.cpp|22|error: field 'ui' has incomplete type|
> main.cpp|39|error: 'Test3' is not a member of 'Ui'|

Im obigen Code enthält Zeile 22 folgendes:
 private:

und Zeile 39 ist eine Leerzeile.

Wie hast du im Designer den Dialog genannt? Heißt er da auch wirklich 
Test3?

Autor: Andre (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
nein, habe ich nicht.
Habe ein screenshot vom designer mitgeschickt.

Autor: Gast0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also muss in der .ui-Datei etwas stehen wie
class Ui_MainWindowClass
{
public:
    void setupUi(QMainWindow *MainWindowClass )
    {..}
    void retranslateUi(..){..}

};

namespace Ui
{
    class MainWindowClass : public Ui_MainWindowClass {};
} // namespace Ui


In deiner Klasse muss dann stehen:
class Foo: public QMainWindow
{
Q_OBJECT
public:
Foo(QWidget* parent = 0, Qt::WFlags flags = 0);
virtual ~Foo();
private:
Ui::MainWindowClass ui;
};

Foo::Foo(QWidget* parent, Qt::WFlags flags)
:QMainWindow(parent,flags)
{
  ui.setupUi(this);
}

Damit sollte es erledigt sein.
Gruß
Gast0815

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt bin ich noch verwirter als vorher

Autor: Fehlerbeschreibungsanalysierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> jetzt bin ich noch verwirter als vorher

Ein bisschen konkreter darf's vielleicht schon sein.

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein besipel wie ich eine ui inn cpp einbinde

Autor: Tutorials sind was Feines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispiel hier kompiliert bei Dir aber?

http://doc.trolltech.com/4.5/designer-using-a-ui-file.html

Welche Version benutzt Du überhaupt?

Autor: Tutorials sind was Feines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, 4.5. Irgendwo im Thread steht's. seufz

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, da oben steht doch ein Beispiel. Und bei Qt sind auch welche dabei, 
wie z.B. http://doc.trolltech.com/4.5/designer-calculatorform.html , 
aber das hat dir ja anscheinend auch nicht geholfen. Was sollte dir also 
noch ein weiteres Beispiel denn bringen?

Autor: Bald zu wxWidgets Wechsler ;-) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier stehen die Sourcecode-Dateien:

http://doc.trolltech.com/4.5/uitools-multipleinher...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tip:

Nicht einfach nur die Beispiele von Trolltech übernehmen, compilieren, 
laufen lassen und "nett" sagen.

In jedes Header File hineinsehen, welche Klassen sind da drinnen.
Wo gehts bei der Demo-Applikation los? Welches Objekt wird erzeugt? 
Welche Member hat dieses Objekt? Wo kommen diese Member wiederrum her?
Interessant sind auch immer Konstruktoren und Destruktoren der Klassen, 
weil sich in ihnen vieles von der Setup-Arbeit verbirgt.

Demos muss man studieren!
Ein Notizblock und ein Bleistift neben dem Monitor helfen ungemein um 
sich Gedankengänge und Dinge die man herausgefunden hat zu notieren. 
Geschriebenes merkt man sich leichter!

Autor: Bald zu wxWidgets Wechsler ;-) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...äh, zu einem anderen Beispiel. ;-)

Autor: Gast0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:
In der .ui-Datei steht natürlich kein Quellcode!
Der erst genannte Code steht in der ui_xxx.h.
Die eigene Klasse muss diese Header-Datei einbinden.

Danach noch eine Instanz dieser Klasse erzeugen, und
show() aufrufen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.