QWidget + QTabWidget
QWidget + QTabWidget
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
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
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.
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.
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.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 :/
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.
Das bringt dir gar nix!kuchen85 hat geschrieben:ja hab in ui_itemTab.h die klasse mit : public QWidget von qwidget abgeleitet lassen...
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!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.
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
Weiterer Vorteil: retranslateUi(). Wenn du das alles manuell mit einem "nur"-QWidget-Objekt siehst du alt aus
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
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
Und genau letzteres ist der Grund, warum ersteres keine Ersparnis istkuchen85 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...
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.