Forum: PC-Programmierung QT QDialog instance soll nur einmal geöffnet werden können


von Mathias F. (savag)


Lesenswert?

Hallo Leute,
in meinem Programm wird per Button ein QDialog geöffnet.
1
calculator_widget = new calculator(this);
2
calculator_widget->show();

jetzt ist es jedoch möglich öfters auf diesen Button zu drücken und den 
Dialog dementsprechend öffters darzustellen.
Dies würde ich gerne unterbinden.

Ich verwende übringens
1
show()
 da dass ganze NICHT MODAL
sein soll!


Gibt es einen eleganten Weg zu prüfen ob das Dialog-Fenster bereits 
geöffnet ist?

von derMosphet (Gast)


Lesenswert?

einfachster Weg:
1
if(!open) {
2
    calculator_widget->show();
3
    open = true;
4
}

"open" muss dabei ein bool sein der in der jeweiligen Klasse dauerhaft 
gespeichert ist.

von Freddi (Gast)


Lesenswert?

calculator_widget = new calculator(this);

nur einmal ausführen , stichwort Flag

von Oliver S. (oliverso)


Lesenswert?

Oder sowas in der Art:
1
Button->SetEnabled(!isOpen);

Oliver

von Rolf M. (rmagnus)


Lesenswert?

Freddi schrieb:
> calculator_widget = new calculator(this);
>
> nur einmal ausführen , stichwort Flag

Ein Flag braucht man eigentlich nicht. Man ruft einfach show() auf, wenn 
der Button gedrückt wird. Wird der Dialog schon angezeigt, passiert bei 
show() einfach nix.
Man könnte den Button auch togglebar machen, so dass beim Einschalten 
der Dialog angezeigt und beim Ausschalten wieder versteckt wird.

von Mathias F. (savag)


Lesenswert?

Rolf M. schrieb:
> Ein Flag braucht man eigentlich nicht. Man ruft einfach show() auf, wenn
> der Button gedrückt wird. Wird der Dialog schon angezeigt, passiert bei
> show() einfach nix.

Danke für zahlreichen Antworten :)

Das ist zwar so korrekt leider wird die Instance durch "X" zerstört.
Somit kann ich nur einmal das Fenster öffnen. Nach dem Beenden und 
erneutem starten gibt es dann einen Fehler da "show()" ausgeführt werden 
soll aber keine instance mehr da ist.

Zum Thema Flag:
Daran habe ich auch schon gedacht. Allerdings dachte ich dass es eine 
"bessere" Methode gibt. Gerade bei QT.

von Schwarzseher (Gast)


Lesenswert?

Mathias F. schrieb:
> leider wird die Instance durch "X" zerstört

Warum? Schalt das ab.

https://doc.qt.io/qt-5/qt.html#WidgetAttribute-enum

Qt::WA_DeleteOnClose wegnehmen....

von Mathias F. (savag)


Lesenswert?

Kleines Update:
Ich habe es vorerst mit einem Flag umgesetzt.

Auf meinem WIN7 PC auf dem auch kompaliert wurde ist alles super.

Auf dem WIN10 PC funktioniert das mit dem Flag nicht zuverlässig!
Manchmal geht das Fenster auf und manchmal nicht. Scheint als würde asd 
Flag nicht zurück gesetzt werden. Vorsorglich mach ich dies im 
CloseEvent aber.

von Mathias F. (savag)


Lesenswert?

Schwarzseher schrieb:
> Mathias F. schrieb:
>> leider wird die Instance durch "X" zerstört
>
> Warum? Schalt das ab.
>
> https://doc.qt.io/qt-5/qt.html#WidgetAttribute-enum
>
> Qt::WA_DeleteOnClose wegnehmen....

Die möglichkeit des Weg-"X"en möchte ich geben! Wollte kein Button in 
das Fenster setzen.

von Georg A. (georga)


Lesenswert?

Du könntest dein calculator-Widget als Singleton implementieren. Klingt 
hochtrabend, ist aber effektiv nur ein kleiner Wrapper mit internem 
("static") Speicher, der die Instanz entweder wirklich neu erzeugt, wenn 
sie noch nicht existiert oder sie nur zurückliefert, falls doch.

von Schwarzseher (Gast)


Lesenswert?

>> Qt::WA_DeleteOnClose wegnehmen....
>
> Die möglichkeit des Weg-"X"en möchte ich geben! Wollte kein Button in
> das Fenster setzen.

Das hab ich doch auch gar nicht vorgeschlagen. Doku Lesen!

Dein Problem war, dass das Dialog-Objekt gelöscht wird, sobald es 
geschlossen wird.
Wegnehmen dieses Flags schaltet genau das ab: Wenn der Dialog 
geschlossen wird (egal ob über "X" oder Enter/Escape-Taste oder Button 
oder sonstwie), wird dein Objekt eben nicht mehr gelöscht, und du kannst 
den Dialog ein zweites, drittes, viertes, ... mal per "show()" 
darstellen.

von apr (Gast)


Lesenswert?

Oder man speichert den Dialog in einem QPointer und erstellt nur einen 
neuen, falls der Null ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.