nici hat geschrieben:hi,
ähm was meinst du damit ob ich die Widgets schon drin habe??
hab das jetzt mal so gemacht wie du es gezeigt hast.
Code: Alles auswählen
//konstruktor
MainWindow::MainWindow(QMainWindow *parent)
:QMainWindow(parent)
{
setupUi(this);
QTabWidget *tabwidget=new QTabWidget();
ui.TabWidget->addWidget(new TabEins(), "TabEins");
ui.TabWidget->addWidget(new TabDrei(), "BildFehlerKoeffizient");
ui.TabWidget->addWidget(new TabZwei(), "PhysikalischeParameter");
};
Fehlermeldunge:
MainWindow.cpp: In constructor 'MainWindow::MainWindow(QMainWindow*)':
MainWindow.cpp:15: error: 'ui' was not declared in this scope
MainWindow.cpp:14: warning: unused variable 'tabwidget'
make: *** [MainWindow.o] Fehler 1
Muss ich irgendwas für das ui includieren??
Und wenn ich es so mache,
Code: Alles auswählen
//konstruktor
MainWindow::MainWindow(QMainWindow *parent)
:QMainWindow(parent)
{
setupUi(this);
QTabWidget *tabwidget=new QTabWidget();
tabwidget.TabWidget->addWidget(new TabEins(), "TabEins");
tabwidget.TabWidget->addWidget(new TabDrei(), "BildFehlerKoeffizient");
tabwidget.TabWidget->addWidget(new TabZwei(), "PhysikalischeParameter");
};
dann kommt die alte Fehlermeldung:
MainWindow.cpp: In constructor 'MainWindow::MainWindow(QMainWindow*)':
MainWindow.cpp:15: error: request for member 'TabWidget' in 'tabwidget', which is of non-class type 'QTabWidget*'
MainWindow.cpp:16: error: request for member 'TabWidget' in 'tabwidget', which is of non-class type 'QTabWidget*'
MainWindow.cpp:17: error: request for member 'TabWidget' in 'tabwidget', which is of non-class type 'QTabWidget*'
make: *** [MainWindow.o] Fehler 1
lg
nici
Wenn ich das auf den letzten Seiten in einem deiner unzähligen Posts richtig gelesen habe, hast du das TabWidget im Designer erstellt.
In dem Code den du nun gepostet hast, erzeugst du per
new ein neues TabWidget. Du hättest somit also 2. Abgesehn davon, dass das komplett sinnfrei ist, hast du dem TabWidget im Konstruktor auch keinen
Parent mitgegeben. In dieses zweite TabWidget fügst du dann 3 Widgets per addWidget ein.
Gut dass es Fehler schmeisst, denn was sinnvolles würde bei dieser Konstruktion auch nicht rauskommen.
Um dir die Sache nochmals zu vereinfachen, eine kurze Anleitung wie man das Designer File im Code verwendet:
- Mainwindow im Designer gestalten (TabWidget einfügen, im TabWidget einzelne Tabs mit Inhalt füllen - eben per Drag & Drop Sachen aus der Palette ins Fenster ziehen)
- Dabei auf die Namensgebung der Objekte achten. Beispiel: Wenn du in ein leeres Projekt ein TabWidget reinziehst, hat dieses als Objektname

m Eigenschaften-Fenster des Designers) "tabWidget". Diesen Namen kannst du so lassen, nur musst du genau diesen Namen wissen, um später auf das TabWidget im Code zugreifen zu können
- die richtige .h Datei inkludieren. Beispiel:
falls du dein Designer-File "project.ui" genannt hast.
- C++ Dateien anlegen, und eine Klasse von QMainWindow UND der UI-Klasse aus dem Designer erben lassen. Beispiel:
Code: Alles auswählen
class ProjectWindow : public QMainWindow, private Ui::ProjectWindow
{
- Im Konstruktor der Klasse rufst du die Methode setupUi auf, und gibts
this als Parameter mit. Damit werden die Objekte, die du im Designer angelegt hast, erzeugt.
- Wenn du das Programm jetzt kompilierst, dürfte das Fenster schon fertig sein. Ggfs. musst du in der main-Funktion (oder eben da, wo deine Fenster-Klasse verwendet wird) entsprechend die show()-Methode aufrufen. Beispiel:
- Wenn du jetzt auf Elemente des TabWidgets zugreifen willst, geht das ganz einfach.
1) du weißt es ist ein QTabWidget. Also schaust du in der
Doku, welche Zugriffsmethoden die Klasse bietet. Da findest du zum Beispiel die methode
addWidget(), sowie
widget(). Die
Doku verrät dir, wozu diese Methoden gut sind, und welche Parameter sie erwarten.
2) die im Designer erzeugten Objekte werden mit new erzeugt, es handelt sich dementsprechend um Zeiger, und du musst per
-> darauf zugreifen, NICHT mit
.
3) da du dir, wie angewiesen, den
Namen des TabWidgets im Designer gemerkt hast, kannst du nun auch problemlos darauf zugreifen. Beispiel:
Code: Alles auswählen
void ProjectWindow:irgendeineMethode()
{
tabWidget->addWidget(new QLabel(this, "Mein Label"), "Meine Tab-Beschriftung");
}
Damit hast du dein im Designer erstelltes Fenster im Code eingebunden, und im Nachhinein ein weiteres Tab zum TabWidget hinzugefügt.
Und bevor du fragst: Nein, ich habe die Hoffnung
immer noch nicht aufgegeben, dass du endlich mal die C++ Grundlagen und die Qt-Doku anschaust.
[edit] Hier noch der Alternative Weg,
komplett ohne Designer:
- C++ Dateien erstellen und eine Klasse von QMainWindow erben lassen (beispiel siehe oben)
- im Konstruktor erzeugst du deine Widgets selbst, etwa so:
Code: Alles auswählen
ProjectWindow:ProjectWindow()
{
QLabel* label = new QLabel("Mein eigenes TabWidget:", this);
QTabWidget* tabWidget = new QTabWidget(this);
tabWidget->addWidget(new QLabel("Mein Label", this), "Mein Tab 1");
tabWidget->addWidget(new QPusButton("Mein Pushbutton", this), "Mein Tab 2");
tabWidget->addWidget(new QCheckBox("Meine Checkbox", this), "Mein Tab 3");
}
- in der main-Methode (oder wo auch immer das Fenster erzeugt wird) ggfs. die show()-Methode aufrufen (beispiel siehe oben)
- auf das TabWidget kannst du so einfach nun aber nicht in anderen Methoden zugreifen, da die tabWidget Variable eine lokale Variable im Konstruktor ist, auf die du sonst nirgends Zugriff hast. Eine Möglichkeit wäre, die child-Elemente des Fensters abzufragen, einfacher ist es aber, das TabWidget als Klassenvariable zu deklarieren (diese Transferleistung überlasse ich dir)
- Das Fenster hat nun kein Layout, und die Größe/Position wurde auch nicht gesetzt. Dementsprechend wird es aussehen wie Kraut und Rüben. Aber die Größe/Position des Fensters bekommst du selber hin (QMainWindow Doku), und das mit dem Layout auch (Layout Examples/Tutorials)