Anzeige:
Ergebnis 1 bis 13 von 13

Thema: QT neuer QDialog aus Programm starten

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185

    QT neuer QDialog aus Programm starten

    Hallo,
    ich möchte aus meinem Programm auf Button-Druck ein neune QDialog öffnen.

    Ich habe den neuen Dialog in einer eigenen .h und .cpp Datei erstellt, binde es mit include bei dem Hauptfenster ein und erstelle im Konstruktor des Hauptfensters eine Instanz davon und verbinde dann das signal Button.Clicked() mit dem SLOT.show() des Dialogs.
    Genau so habe ich jetzt zwei Dialoge eingebaut, der erste wird normal angezeigt und beim zweiten steht in der Titelleiste "name_des_Fensters <2>".
    Das <2> sagt doch eigentlich das es das zweite Fenster mit dem selben Namen ist, oder? Es ist aber nur eines da

    Vielleicht noch ein paar Zeilen code, so sind beide Fenster im Hauptfenster eingebunden:

    Code:
    [..]
    
    #include "summarywindow.h"
    #include "aboutwindow.h"
    
    [..]
    MainWindow::MainWindow(Noten *noten, QWidget *parent, const char *name)
        : QDialog(parent, name)
    {
    
        notenliste = noten;
    
        sw = new SummaryWindow(notenliste);
        sw->setCaption("Zusammenfassung");
    
        aw = new AboutWindow();
        aw->setCaption("About");
    
        [..]
    
        connect(aboutButton, SIGNAL(clicked()), aw, SLOT(show()));
        connect(summaryButton, SIGNAL(clicked()), sw, SLOT(show()));
    
        [..]
    Ausserdem kann ich im neuen Fenster nicht auf die Werte der Notenliste zugreifen, obwohl ich es ja als Konstruktor übergeben habe

    Wenn ihr noch weitere code Teile braucht sagt bescheid.

    Danke!

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  2. #2
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    Hi,

    eine genauere Definition von "Ausserdem kann ich im neuen Fenster nicht auf die Werte der Notenliste zugreifen" wäre schön .

    "Das <2> sagt doch eigentlich das es das zweite Fenster mit dem selben Namen ist, oder?"
    Ja, sollte so sein. Hat vielleicht dein Mainwindow die gleiche Caption?

    Gruss,
    Michael.

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Hallo,

    Original geschrieben von tuxipuxi

    eine genauere Definition von "Ausserdem kann ich im neuen Fenster nicht auf die Werte der Notenliste zugreifen" wäre schön .
    Wie der Name schon vermuten lässt sind darin mehrer Noten gespeichert und die Statistik dazu (bestanden, nicht bestande, durchschnitt).

    In dem neuen Fenster sollen jetzt die Statistik ausgegeben werden. Allerdings haben da jetzt alle Werte den Wert 0 obwohl im Hauptfenster noch Werte in der Notenliste stehen.


    "Das <2> sagt doch eigentlich das es das zweite Fenster mit dem selben Namen ist, oder?"
    Ja, sollte so sein. Hat vielleicht dein Mainwindow die gleiche Caption?
    Nein,
    Hauptfenster -> Notenberechnung
    Dialog1 -> About
    Dialog2 -> Zusammenfassung

    Nur bei Zusammenfassung wird immer das <2> mit angegeben

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  4. #4
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Hallo,
    OK, bei dem Problem mit dem Zugriff auf die Daten habe ich den Fehler gefunden. Die Werte wurden im Konstruktor gesetzt, also gleich am Anfang, dass erklärt warum die Werte auf 0 sind.
    Aber wie bekomme ich da jetzt am geschicktesten die Wert hin in dem Moment wo es angezeigt wird?

    Das Problem mit der <2> besteht aber noch.

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  5. #5
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    Hi,

    bei dem Problem mit der <2> vermute ich einfach mal, dass dein Windowmanager die Dialoge einer Applikation so durchnummeriert( kann mich auch täuschen, anda_skoa wird es wissen ).

    Das Problem mit den Werten der Notenliste kann ich noch nicht ganz nachvollziehen. In welchem Konstruktor wurden die Werte gesetzt und wieso erklärt das, warum die Werte auf 0 gesetzt sind?

    Gruss,
    Michael.

  6. #6
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Original geschrieben von tuxipuxi
    bei dem Problem mit der <2> vermute ich einfach mal, dass dein Windowmanager die Dialoge einer Applikation so durchnummeriert( kann mich auch täuschen, anda_skoa wird es wissen ).
    ich werde es gleich mal mit verschiedenen WMs testen.

    EDIT: OK, Test durchgeführt, es liegt wirklich am WM, unter KDE kommt dieses <2>, bei gnome(metacity) nicht! Ich verstehe dann aber immer noch nicht warum diese <2> nur bei dem einem Dialog kommt und bei dem anderen nicht
    Scheint irgendwie eine komische Eigenart von KDE zu sein.

    Das Problem mit den Werten der Notenliste kann ich noch nicht ganz nachvollziehen. In welchem Konstruktor wurden die Werte gesetzt und wieso erklärt das, warum die Werte auf 0 gesetzt sind?
    Die Labels, in denen die Werte angezeigt werden habe ich im Konstruktor des Dialogs positioniert und auch gleich mit Werten gefüllt. Da der Dialog gleich beim Programmstart instanziiert wird sind natürlich noch alle Werte in der Notenliste 0 und deswegen werden auch immer die Werte angezeigt unabhängig davon ob sich in der Statistik im laufe des Programms was ändert oder nicht.
    Ich habe es jetzt so gelöst, das der Dialog noch einen public slot update() hat der in die labels die aktuellen Werte schreibt. Beim click auf den Button der das Fenster anzeigt wird jetzt das Signal update() und show() gesetzt und damit habe ich immer die aktuelle Statistik im Fenster wenn ich es aufrufe.
    Geändert von BeS (24-02-2004 um 21:12 Uhr)

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Wenn du im zweiten Dialog exklusiv arbeiten kannst, also dabei mit irgendwelche Sachen im Hauptfenster klicken musst, rate ich zu einem Modalen Dialog, den du erst erzeugst, wenn du ihn brauchst.

    Bei nicht modalen Dialogen hast du zwei Möglichkeiten:
    - du benachrichtigst den zweiten Dialog mit einem Signal wenn sich die Daten ändern
    - du connectest nicht auf show() sondern einen eigenen Slot, der die Daten aktualisiert und selbst show() aufruft.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Hallo,

    Original geschrieben von anda_skoa
    Wenn du im zweiten Dialog exklusiv arbeiten kannst, also dabei mit irgendwelche Sachen im Hauptfenster klicken musst, rate ich zu einem Modalen Dialog, den du erst erzeugst, wenn du ihn brauchst.
    Danke! modal war er schon, aber ich dachte wenn ich in erst in einer Funktion buttonClicked() erzeuge und anzeige, dass er dann gleich wieder zerstört wird wenn sich die Funktion beendet. Aber das scheint ja nicht der Fall zu sein

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von BeS
    Danke! modal war er schon, aber ich dachte wenn ich in erst in einer Funktion buttonClicked() erzeuge und anzeige, dass er dann gleich wieder zerstört wird wenn sich die Funktion beendet. Aber das scheint ja nicht der Fall zu sein
    Er wird natürlich schon zerstört, aber da er dann nicht mehr gebraucht wird, ist das ja egal.

    Sobald exec() zurückkehrt, ist der Dialog fertig, man liest eventuell noch Daten über get-Methoden aus, aber dann ist er überflüssig.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  10. #10
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Original geschrieben von anda_skoa
    Er wird natürlich schon zerstört, aber da er dann nicht mehr gebraucht wird, ist das ja egal.
    Aber die Funktion warte ja nicht bis ich den Dialog schließe.

    Also ich habe es jetzt so gelöst:

    Code:
    void MainWindow::aboutButtonClicked()
    {
        AboutWindow *aw = new AboutWindow();
    
        aw->setCaption("About");
        aw->show();
    
        std::cout << "bye";
    }
    aboutButtonClicked() ist ein public slot der angesprochen wird wenn ich auf den about Button im Hauptfenster clicke. Dann wird das about Fenster erzeugt und "bye" auf der console ausgegeben, d.h. die Funktion aboutButtonClicked() müsste beendet sein, da ich nach der Ausgabe von bye raus bin. Der About Dialog bleibt aber weiterhin solange stehen bis ich es mit dem click auf den OK-Button beende. Also überlebt der About-Dialog doch länger wie die Funktion die ihn gestartet hat, auch wenn es für mich spontan nicht erklärbar ist im Hinblick auf den Gültigkeitsbereich der *aw Variablen, da die ja zerstört werden müsste wenn die Funktion aboutButtonClicked() beendet wird.

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  11. #11
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Darum schreibe ich ja die ganze Zeit etwas von der Methode exec()

    show() ist nicht modal, exec() schon.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  12. #12
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Original geschrieben von anda_skoa
    Darum schreibe ich ja die ganze Zeit etwas von der Methode exec()

    show() ist nicht modal, exec() schon.
    achso, ich glaube jetzt habe ich es verstanden

    Wenn ein Dialog modal ist überlebt er auch das ende der Funktion die ihn aufgerufen hat, stimmts?
    Das er modal gestartet wird erreicht man indem man exec() anstelle von show() verwendet.
    Ich habe die Option modal in den Konstruktor aufgenommen, deswegen blieb mir wahrscheinlich der Dialog auch mit show() erhalten.

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  13. #13
    Registrierter Benutzer
    Registriert seit
    16.09.2002
    Beiträge
    73
    Nicht ganz. Folgendes Beispiel:

    1. Du machst in Deinem Hauptfenster einen Slot - sagen wir show_summary()
    2. connecten im Hauptfenster-konstruktor: connect(summaryButton, SIGNAL(clicked()), SLOT(show_summary()));
    3. show_summary():
    Code:
    SummaryWindow sw(notenliste);
    sw.exec();
    Damit brauchst Du kein new und kein update(). Wenn das sw-Fenster angezeigt wird, kannst Du in Deinem Hauptfenster nix machen und wenn es wieder geschlossen ist, wird es eh nicht gebraucht und wird automatisch am Ende von show_summary() gelöscht.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •