Widgets mit "dynamischem" Inhalt

Alles rund um die Programmierung mit Qt
Antworten
romankreisel
Beiträge: 4
Registriert: 22. Oktober 2007 09:12
Kontaktdaten:

Widgets mit "dynamischem" Inhalt

Beitrag von romankreisel »

Hallo allerseits,

ich habe ein Widget (QMainWindow) welches mehrere Widgets enthält. Eines dieser Elemente soll ein Container für ein weiteres Widget sein. Dieser Container soll je nach Anwendungsfall mit unterschiedlichen Widgets gefüllt werden, wobei ich hier nicht Instanzen von allen Widgets in einem QWidgetStack vorhalten möchte, sondern wirklich jedesmal eine neue Instanz erzeugen und anzeigen möchte.

Ich versuche mich an dieser Aufgabe nun schon seit ca. 2 Tagen, die Resultate sind jedoch recht dürftig. Es funktioniert einfach nicht: wenn ich als ContainerWidget QWidgetStack benutze ist das Handling mehr als bescheiden, ausserdem entstehen unschöne Grafikfehler (Vielleicht verträgt sich auch das QGLWidget nicht mit dem QWidgetStack, wenn es nach dessen show() eingefügt wird). Wenn ich einfach nur eine QVBox benutze erscheint das neu eingefügte Widget einfach nicht.


Wie macht man sowas ordentlich? Das neu eingefügte Widget soll seine SizePolicy durchsetzen können und vor allem soll es überhaupt mal erscheinen. Wenn dann noch keine Grafikfehler dabei entstehen bin ich absolut zufrieden ;)


Viele Grüße
Roman

P.S.: Ich benutze noch QT3.3, ein umstieg auf QT4 ist leider momentan auch ausgeschlossen
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du wirst wohl dein Widget auf definierte Userinteraktion hin ändern wollen.
Da wäre es doch eine Möglichkeit, das per SLOT in deinem MainWindow/Widget zu implementieren. Da du von vornherein wissen wirst, welche Widgets das sind (und jedes Widget eine definierte Funktion bereithält) kannst du dir ein enum definieren.

Dann reicht es, wenn du deinem SLOT als Parameter dieses Enum (oder eben nur ein int) mitgibts, und entsprechend dann dein Widget einfügst.

Z.B.:

Code: Alles auswählen

void MainWindow::changeWidget(int action)
{
    switch(action) {
        case HitParade:
            HitParadeWidget* w = new HitParadeWidget(this);
            mainLayout->addWidget( w, 5, 6 );  // wenn du ein GridLayout verwendest
            break;
        // weitere Fälle...
    }
}
Du weißt ja hoffentlich, an welcher Stelle du dein Widgets einfügen willst.

Bevor du das neue WIdget einfügst, solltest du natürlich das alte löschen.

Grüße
Franz
Antworten