QWidget + QTabWidget

Alles rund um die Programmierung mit Qt
Antworten
kuchen85
Beiträge: 6
Registriert: 10. April 2010 15:29

QWidget + QTabWidget

Beitrag von kuchen85 »

Hallo

ich habe in meinem Programm ein QTabWidget. ich möchte neue Tabs mit einem selbst erstellten QWidget (im designer erstellt) hinzufügen. Die Widgets hab ich mit dem Designer schon erstellt (*.ui Datei). Wenn ich jetzt aber ui.tabWidget->addTab(new Ui::ItemTab,"bla") aufrufe kommt nur ein leerer Tab zustande...könnt ihr mir bitte helfen wie ich die Klasse ItemTab richtig Implementiere.

Danke, Johannes
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Was ist "Ui::ItemTab"? Wo kommt es her?
kuchen85
Beiträge: 6
Registriert: 10. April 2010 15:29

Beitrag von kuchen85 »

hab in vs2008 mit qt auf neues element gedrückt und dann nen qt widget erstellt, mit dem namen "itemTab".
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich kenn den VS2008 nicht, aber ich nehme an da gibt es ein Plugin, mit dem man Qt-Widgets erzeugen kann. Aber irgend welche Dateien muss der erzeugt haben. Und wenn das kompiliert, dann ist Ui::ItemTab eine von QWidget abgeleitete Klasse, andernfalls müsste sich der Compiler beschwert haben.
Schau mal deine Projektfiles durch, ob da irgendwo ein "itemtab.ui" rumfliegt. Dieses mit dem Qt-Designer öffnen und nach Belieben Widgets hinzufügen und mittels Layouts anordnen.
kuchen85
Beiträge: 6
Registriert: 10. April 2010 15:29

Beitrag von kuchen85 »

genau itemTab.ui hab ich erzeugt (auch schon mit labels und so gefüllt und layout angeordnet). QT macht daraus ui_itemTab.h. darin ist ne klasse unter namespace Ui und dem klassennamen itemTab (deswegen auch Ui::itemTab) leider zeigt er dieses widget aber nicht an :/

mfg
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

kuchen85 hat geschrieben:darin ist ne klasse unter namespace Ui und dem klassennamen itemTab (deswegen auch Ui::itemTab) leider zeigt er dieses widget aber nicht an :/
Dann kann aber dein Code in keinster Weise kompilieren! Ui::itemTab ist nicht von QWidget abgeleitet, somit MUSS tab.addTab(newUi::itemTab); einen Fehler ergeben.

Du musst einfach die Doku lesen.
http://doc.trolltech.com/4.6/designer-manual.html
Da steht genau drinnen, wie du aus nem .ui ein widget bekommst. Und nicht einfach schnell drüber huschen. Lass dir Zeit, es wird sich lohnen.
kuchen85
Beiträge: 6
Registriert: 10. April 2010 15:29

Beitrag von kuchen85 »

ja hab in ui_itemTab.h die klasse mit : public QWidget von qwidget abgeleitet lassen...aber ich werd mir jetzt mal in aller ruhe die doku durchlesen danke für deine tipps. wenns geklappt hat melde ich mich später nochmal
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

kuchen85 hat geschrieben:ja hab in ui_itemTab.h die klasse mit : public QWidget von qwidget abgeleitet lassen...
Das bringt dir gar nix!
1) Schau mal was oben in dem ui:itemTab.h drin steht:

Code: Alles auswählen

** WARNING! All changes made in this file will be lost when recompiling UI file!
Nicht editieren!
2) Da fehlt das wichtige "Q_OBJECT" in der Klasse
3) Mit einem ": public QWidget" hast du noch immer keinen eigenen Konstruktor, in dem das Widget initialisiert wird, es gibt nur den Default-Konstruktor von QWidget, deshalb bekommst du auch ein "nackiges" Widget.
kuchen85
Beiträge: 6
Registriert: 10. April 2010 15:29

Beitrag von kuchen85 »

so habs jetzt hinbekommen:

Ui::itemTab item;
QWidget widget = new QWidget();
item.setupUi(widget);
ui.tabWidget(widget,"foo");

dann hab ich das gewünschte widget in meinem tab

danke nochmal =)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Der normale Weg ist aber, eine eigene Klasse von QWidget abzuleiten und dann und da im Konstruktor das setupUi() aufzurufen. Dann brauchst du nämlich nur deine eigene Klasse zu instantiieren.
Weiterer Vorteil: retranslateUi(). Wenn du das alles manuell mit einem "nur"-QWidget-Objekt siehst du alt aus :D
kuchen85
Beiträge: 6
Registriert: 10. April 2010 15:29

Beitrag von kuchen85 »

naja so klappts auch...und da hab ich mir eine klasse gespart...

hab aber gleich noch ne andere frage:

ich will dann später wieder auf das widget vom tabwidget zugreifen und dort auf das editlabel auf dem widget...um dort text auszulesen...

wenn ich jetzt QTabWidget.widget(i)->lineEdit() eingebe gibts eine fehlermeldung, dass QWidget lineEdit nicht enthält...was mir auch klar ist...aber widget(i) gibt ja wieder ein widget zurück, in dem ein lineedit ist...

habt ihr da auch noch einen tipp?

mfg
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

kuchen85 hat geschrieben:naja so klappts auch...und da hab ich mir eine klasse gespart...

[...]
wenn ich jetzt QTabWidget.widget(i)->lineEdit() eingebe gibts eine fehlermeldung, dass QWidget lineEdit nicht enthält...was mir auch klar ist...aber widget(i) gibt ja wieder ein widget zurück, in dem ein lineedit ist...
Und genau letzteres ist der Grund, warum ersteres keine Ersparnis ist ;)
Schreib dir eine Klasse, die von QWidget abgeleitet ist. Nimm einen der beiden Möglichkeiten (single inheritance oder oder multiple inheritance), und schreib dir ein Interface, über das andere Klassen mit einem Objekt deines eigenen Widget kommunizieren können.
Dann wäre es nicht schlecht wenn du dir das Widget auch speicherst! Dann sparst du dir einen qobject_cast, der notwendig wird, um das Widget, das dir QTabWidget.widget() zurück liefert in dein eigenes Widget zu casten.
Antworten