Anfängerproblem: Neue Klasse aus Objekten von QMainWindow

Alles rund um die Programmierung mit Qt
Antworten
CBM
Beiträge: 38
Registriert: 6. Mai 2009 19:09

Anfängerproblem: Neue Klasse aus Objekten von QMainWindow

Beitrag von CBM »

Hallo,
vielleicht stehe ich einfach nur auf dem Schlauch, aber als Anfänger habe ich mal wieder so viele Bäume vor mir, dass ich es einfach nicht sehen will:

Über QTDesigner habe ich mir ein QMainWindow erzeugt und in diesem liegt ein QTabWidget.

Ich (Anfänger) habe in meinen wenigen Übungen dann immer mit
class A : public QMainWindow, public Ui::MainWindow { ...

meine Klasse geschaffen, mit der ich weiter arbeiten konnte.

Jetzt würde ich aber gerne etwas strukturierter werden und jedes Tab des QTabWidget-Objektes mit seinen Eingabefeldern als eigene Klasse haben.

Im ui_-Header-File (erzeugt von QTDesigner) habe ich gesehen, dass es unter anderem folgende Zeilen zu meiner Tab gibt:
QWidget *tab_A;
tab_A = new QWidget();
tab_A->setObjectName(QString::fromUtf8("tab_A"));

==> Meine erste Verständnisfrage: das tab_A selbst stellt keine Klasse dar, sondern nur ein Zeiger auf eine Instanz der Klasse QWidget, oder?

Irgendwie weiß ich jetzt nicht so recht, wie ich tab_A ansprechen kann, um meine neue Klasse zu deklarieren. In meiner Anfängernaivität dachte ich so (nicht gleich lachen):

class B : public QWidget, public Ui::tab_A {
Q_OBJECT

public:
B();
~B();
};

(Auch Hinweise, wo ich im Internet, der QT-Doku oder im QT4 Buch nachlesen kann, sind willkommen ... )
Vorab Danke.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Der Designer ist kein Programmierwerkzeug zum erstellen neuer Klassen! Das ist wie ein Zeichenprogramm, in dem du dir deine Benutzeroberfläche malen kannst.

Wenn du jedes Tab separat haben willst, dann schreib dir eine eigene Klasse, die du von QWidget ableitest, und/oder du erstellst dir ein separates ui mit dem Designer für jedes Widget. Ins Tab bekommst du es mit den üblichen Methoden aus QTabWidget.
Dein Vesuch, von einer Instanz abzuleiten, geht nicht nur nicht mit Qt, das ist in C++ absolut unmöglich!

Grüße
Franz
CBM
Beiträge: 38
Registriert: 6. Mai 2009 19:09

Beitrag von CBM »

ich werde verrückt. Ich habe es hinbekommen. Besten Dank an Franz: so ein Hinweis, in welche Richtung man denken sollte hiflt schon (c++ habe auch erst vor 2 Wochen angefangen).

Damit dieser Thread auch was bringt für alle, die vielleicht später auch mal dieses Problem haben, hier meine Lösung etwas deaillierter (vielleicht macht Franz noch Anmerkungen, wie man es noch professioneller hätte machen können):

- Im QTDesigner Neu --> Widget;
- In diesem Widget habe ich dann nur die Inhalt des Tabs nachgebildet, also die Felder übertragen (ging sogar mit Cut and Paste);
- Im QTDesigner das neue Widget unter einem Namen abgespeichert (sagen wir mal TabWidget);
- TabWidget.ui im Projektfile xxx.pro ergänzt
- In meinem Header file, indem ich auch MainWindow abgeleitet habe, zunächst #include ui_TabWidget.h ergänzt und dann die Widget-Klasse erstellt durch:

class WidgetClass : public QWidget, public Ui::Form {
Q_OBJECT

public:
WidgetClass(QWidget *parent=0);
~WidgetClass();

- In der zur Header file korrespondierenedn cpp Datei, dann die Konstruktoren und Destruktoren erstellt:

WidgetClass::WidgetClass(QWidget *parent) : QWidget(parent) {
setupUi(this);
}

WidgetClass::~WidgetClass() {
}

- und schließlich noch im Konstruktor, in dem sich auch das TabWidget befindet, folgendes ergänzt:
WidgetClass *x = new(Reiseangaben);
tabWidget->addTab(x, "TEST");

... macht einfach Spass, wenn man etwas hinbekommt (und dass nachdem ich gerade mal ein c++ Konsolenbuch und die QT-Doku angesehen habe. Yipie).
Antworten