Aus 2 mach 1: wie verwalte ich zwei widgets (UI)

Alles rund um die Programmierung mit Qt
Antworten
liberavia
Beiträge: 1
Registriert: 18. Dezember 2006 16:29

Aus 2 mach 1: wie verwalte ich zwei widgets (UI)

Beitrag von liberavia »

Hallo alle zusammen!

Mann, bin ich froh dieses Forum entdeckt zu haben. Der QT-Assistant ist zwar ei gutes Mittel, hilft mir bei meinem aktuellen (100%igen Anfänger-)Problem leider nicht weiter. Meine Frage ist denke ich für euch so einfach zu beantworten, dass ich in der Forensuche nix zum Thema gefunden habe.
Ich verwende den QTDesigner 3.
Worum gehts?

Beim Erstentwurf einer Anwendung wollte ich zunächst eine Hauptanwendung und die Konfigurationsanwendung als einzelne Applikationen realisieren (wie z.B. wine und winecfg). Im nachhinein eine dämliche Entscheidung, da die Daten der Konfigurationsdatei für die Hauptanwendung immer aktuell vorliegen müssen. Außerdem muss die Hauptanwendung ebenfalls auf die Konfiguraration zugreifen und ändern. Dieses muss absolut synchron passieren.

Mein Lösungsansatz war, dass ich die beiden UIs in einem Projekt zusammengefasst habe, wobei in der main-Funktion zunächst nur die Hauptanwendung angezeigt wird. Hier die main-funktion:

Code: Alles auswählen

#include <qapplication.h>
#include "kbt_mainwindow.h"
#include "kbt_konfiguration.h"
int main( int argc, char ** argv )
{
    QApplication a( argc, argv );
    kbt_mainwindow w;
    // kbt_konfiguration kfenster;
    // kbt_konfiguration konfiguration;
    w.show();
    // konfiguration.show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
}
kbt_mainwindow ist das Hauptfenster (ehemals Hauptanwendung)
kbt_konfiguration ist das Konfigurationsfenster (ehemals Konfigurationsanwendung)
Beide sind als Widgets erstellt worden. Die Kommentare waren ein paar Versuche die Widgets global verwendbar zu machen. Funktioniert so nicht.

in kbt_mainwindow ist eine Schaltfläche, die den Konfigurationsdialog aufruft:

Code: Alles auswählen

void kbt_mainwindow::ZurKonfigurationSlot()
{
    pushButtonKonfiguration->setEnabled( false );
    kbt_konfiguration *kfenster = new kbt_konfiguration;
    kfenster->show();
    
    // kbt_konfiguration *konfiguration;
    // konfiguration = new kbt_konfiguration( kfenster );
    // konfiguration->show();    
}
Das Fenster wird zwar aufgerufen aber die Lösung ist mist, denn:
Mit jedem weiteren Klick auf den Button wird ein weiteres Fenster erzeugt.
Beim Schließen des Konfigurationsfensters (close-methode) wird ebenfalls die Hauptanwendung geschlossen.

Die entscheidene Frage:
Wie mache ich es jetzt richtig, wenn ich beide Fenster von einer globalen Ebene beliebig aufrufen und deren Zustände und Daten ändern möchte?


Am besten so wie ich es mit einem QWidgetStack funktionieren würde. Falls das alles so nicht möglich ist werde ich auch ein QWidgetStack statt zwei einzelnen Fenstern verwenden. Elegant fände ich diese Lösung jedoch nicht.

Danke für jeden "Wegweiser"

Gruß

André
Die Entscheidung zwischen OpenSource- und proprietärer Software ist die Entscheidung zwischen Evolution und Marketing.
Welches dieser Prinzipien ist Deiner Meinung nach bewährter und nachhaltiger?
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

dein Konfig-Fenster sollte ein modaler Dialog sein. Bei einem Click auf den Buttom im Hauptfenster wird diese in Hintergrund verschoben, solange die Konfig. aktiv ist.
Also den Konfig.-Dialog von QDialog ableiten und mittels der Methode exec() anzeigen (auf die Modal-Eigenschaft achten).


BTW: du zerstörst dein kfenster in void kbt_mainwindow::ZurKonfigurationSlot() nicht. Also delete nicht vergessen oder gleich eine einfache lokale Instanz verwenden.
Gruß Marco
Antworten