Seite 1 von 1
QWidget + QTabWidget
Verfasst: 10. April 2010 15:43
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
Verfasst: 10. April 2010 15:50
von franzf
Was ist "Ui::ItemTab"? Wo kommt es her?
Verfasst: 10. April 2010 15:52
von kuchen85
hab in vs2008 mit qt auf neues element gedrückt und dann nen qt widget erstellt, mit dem namen "itemTab".
Verfasst: 10. April 2010 16:02
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.
Verfasst: 10. April 2010 16:10
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
Verfasst: 10. April 2010 16:17
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.
Verfasst: 10. April 2010 16:20
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
Verfasst: 10. April 2010 16:24
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.
Verfasst: 10. April 2010 16:41
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 =)
Verfasst: 10. April 2010 16:48
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

Verfasst: 10. April 2010 17:43
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
Verfasst: 10. April 2010 17:58
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.