GUI: Vererbung / Desingentscheidung

Alles rund um die Programmierung mit Qt
Antworten
Mr.Green
Beiträge: 21
Registriert: 6. September 2009 21:50

GUI: Vererbung / Desingentscheidung

Beitrag 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
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag 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.
Mr.Green
Beiträge: 21
Registriert: 6. September 2009 21:50

Beitrag 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.
Antworten