Seite 1 von 1

GUI: Vererbung / Desingentscheidung

Verfasst: 19. März 2010 23:04
von Mr.Green
Hallo,

ich hab eine Klasse, die mir ein paar Steuerelemente (nennen wir sie class CtrlWidget) aufbaut.
Von dieser Klasse brauche ich eine erweiterte Version: vererben oder verwenden?

In der CtrlWidget wird das Steuerelement im Konstruktor aufgebaut.
Wenn ich jetzt eine CtrlAdvancedWidget baue, die abgeleitet ist, wird doch der Konstruktor von CtrlWidget implizit aufgerufen und zeichnet damit alle seine Elemente, oder? (zumindest war in meinen Tests das Layout immer zerstört). Das spricht gegen Vererbung.

Gegen Verwendung aber spricht doch, dass ich viele Routinen (z.B. sowas wie CtrlWidget::setData, switchAllOn etc) neu in CtrlAdvancedWidget implementieren muss...

Ist mein Problem klar geworden? Wie macht man sowas?

Ich glaube, ich könnte es dadurch lösen, dass ich die Steuerelemente im CtrlWidget erst explizit durch Aufruf von z.B. show() aufbaue. Die Lösung gefällt mir aber nicht.

Gruß
Mr.Green

Verfasst: 20. März 2010 00:31
von Chris81T
Hallo,

ich versuch es mal...

Vorschlag 1:

Setze eine Klasse oben drüber (event. eine abstrakte), von der je die zwei Widget-Klassen erben. Diese bietet deine "Gemeinsamkeiten" an, bzw. gibt Richtlinien vor, die von jeder zu erbenden Klasse einzuhalten sind.
Die eigentlichen Widgets bieten dann ihre spezifische Funktionalitäten an.

Vorschlag 2:
Du hattest auch geschrieben, dass deine Advanced die "einfache" Widget Klasse erweitern soll. Wenn nun die Advanced genau die gleichen Steuerelemente beinhalten soll (mit gleicher Funktion), und diese lediglich durch ein paar weitere erweitern soll, würde sich schon eine Vererbung anbieten.
(zumindest war in meinen Tests das Layout immer zerstört).
Nun gut, ich denke mal, es liegt an einem anderen Problem.

Ja du hast recht, bei einer Vererbung würde zuerst der ctor deiner einfachen Widget Klasse aufgerufen werden. Diese erzeugt die eigenen Elemente und fügt diese in ein LAyout ein. Nun kommt der ctor der advanced Klasse. Diese kann doch ohne Probleme weitere Widgets in das Layout packen (Layout sollte "protected" sein, dann hast du doch Zugriff drauf).

Es ist halt schwer zu sagen, was nun genau die beste Lösung für dein Problem ist, da man den Hintergrund nicht kennt bzw. nicht mehr Informationen zu deinem Projekt hat.

Trotzdem viel Erfolg.

Verfasst: 20. März 2010 11:19
von Mr.Green
Hi,

dann habe ich wohl noch einen Denkfehler innerhalb des Konstruktoes.

Der einfache macht folgendes (Baut ein Schachbrett aus Checkboxen auf):

Code: Alles auswählen

CubeLayerWidget::CubeLayerWidget()
{
    QGridLayout *layout = new QGridLayout;

    for(int i=0; i < ROWS_PER_LAYER;i++)
    {
        for(int k=0; k < LEDS_PER_ROW; k++)
        {
            leds[i][k] = new QCheckBox;
            layout->addWidget(leds[i][k], i, k, 1, 1, Qt::AlignCenter);
        }
    }
     this->setLayout(layout);
}
Der erweiterte fügt noch ein paar Buttons unten hinzu:

Code: Alles auswählen



CubeLayerWidgetControls::CubeLayerWidgetControls(QString title)
{
    m_layer = new CubeLayerWidget;

    QVBoxLayout *layout = new QVBoxLayout;
    QHBoxLayout *h_layout = new QHBoxLayout;
    QWidget *btn_box = new QWidget;
    QLabel *label = new QLabel(title);
    label->setAlignment(Qt::AlignCenter);
    label->setFont(QFont(NULL, 0, QFont::Bold));

    QPushButton *on = new QPushButton("An", NULL);
    QPushButton *off = new QPushButton("Aus", NULL);
    QPushButton *invert = new QPushButton("invert.", NULL);

    connect(on, SIGNAL(clicked()), this, SLOT(on_ButtonOn_clicked()));
    connect(off, SIGNAL(clicked()), this, SLOT(on_ButtonOff_clicked()));
    connect(invert, SIGNAL(clicked()), this, SLOT(on_ButtonInvert_clicked()));

    h_layout->addWidget(on);
    h_layout->addWidget(off);
    h_layout->addWidget(invert);
    btn_box->setLayout(h_layout);

    layout->addWidget(label);
    layout->addWidget(m_layer);
    layout->addWidget(btn_box);
    layout->setAlignment(Qt::AlignCenter);

    this->setLayout(layout);
}

Das Problem mit dem zerschossenen Layout ist, dass unten keine Buttons (die der erweiterte aufbauen soll) angezeigt werden.

Ich dachte, dass ich mir im erweiterten ein Objekt (m_layer) vom einfachen hole und es dann in mein Layout einbaue.