QDialog wird ignoriert



  • Wenn ich einem Projekt die Qt-Designer-Formularklasse "Dialog with Buttons Bottom"
    hinzufüge, eine Instanz dieser Klasse erzeuge und der Benutzer dadurch entweder "Ok" oder "Abbrechen" wählen muss,
    wird die Wahl des Benutzers komplett ignoriert.

    Beispiel:

    Ich mache eine Sicherheitsabfrage.

    sicherheitsabfrage *dialog1 = new sicherheitsabfrage();
    dialog1->setWindowModality(Qt::ApplicationModal); //Wenn das fehlt, ist der Dialog nicht im Vordergrund
    dialog1->show();
    
    if(dialog1->Accepted)
        	{
    	//Code...
    	}
    

    Der Code wird immer ausgeführt.
    Und zwar gleichzeitig mit dem Dialog.
    Welchen Sinn hat das? Ich habe doch die "Zustände" Accepted und Rejected.
    Falls man es als Zudtände bezeichnen kann, denn es sind keine Methoden. Diese wären dann klein geschrieben.
    Deshalb würde ich erwarten, dass der Code nur ausgeführt wird, wenn der Benutzer auf "Ok" klickt.
    Weis jemand, warum der Code gleichzeitig mit dem Dialog ausgeführt wird?

    Die Eigenart tritt übrigens auch bei folgender Variante auf:

    dialog1->Rejected;
    if(dialog1->Accepted)
        	{
    	//Code...
    	}
    


  • Um einen QDialog modal auszuführen gibt es die exec() Funktion (https://doc.qt.io/qt-5/qdialog.html#exec)

    Versuch mal sowas:

    auto returnValue = dialog1->exec();
    
    if(returnValue == QDialog::Accepted)
    {
    	//Code...
    }
    

    Edit:

    @theAnfänger77 sagte in QDialog wird ignoriert:

    Welchen Sinn hat das? Ich habe doch die "Zustände" Accepted und Rejected.
    Falls man es als Zudtände bezeichnen kann, denn es sind keine Methoden. Diese wären dann klein geschrieben.

    Das sind die möglichen Zustände, die der Dialog zurück geben kann. Aber du musst den tatsächlichen Zustand irgendwo herholen. Accepted ist einfach ein Teil eines Enums und hat immer den Wert 1. und if(1) wird halt immer ausgeführt.



  • @Schlangenmensch sagte in QDialog wird ignoriert:

    Um einen QDialog modal auszuführen gibt es die exec() Funktion

    Ja! Leider steht dann in der Doku zu exec:

    Note: Avoid using this function; instead, use open().

    Sollte man dem folgen, muss man sich an das finished Signal hängen und erst dort das Ergenbnis behandeln.



  • @manni66 Hups, man merkt, dass ich in den letzten Jahren eher wenige Berührungspunkte mit QT hatte. Aber interessant, dass der Beispielcode in der Doku exec() benutzt.



  • @Schlangenmensch
    Naja, in Detailed Description zu QDialog steht

    The most common way to display a modal dialog is to call its exec() function.

    Die wissen es also selber nicht so genau ...



  • @manni66 sagte in QDialog wird ignoriert:

    The most common way to display a modal dialog is to call its exec() function.

    Der Kommentar ist vermutlich veraltet.
    Ich kannte open bis jetzt nicht, weil ich noch sehr viel mit alten Qt Versionen zu tun hatte (und mich in den letzten Jahren auch sehr wenig für GUI Programmierung interessiert habe). Aber das hört sich gut an, genau die beschriebenen Probleme (und andere auch) mit exec hatten wir oft. Wenn die das jetzt mit open besser gelöst haben, hört sich das auf jeden Fall sinnvoll an.



  • 👍 👍 👍 Danke!

    sicherheitsabfrage dialog1;
    dialog1.setWindowTitle("Sicherheitsabfrage");
    dialog1.setWindowModality(Qt::ApplicationModal);
    dialog1.show();
    if(dialog1.exec())
    {
     Code...
    }
    

Anmelden zum Antworten