Alternativen zu QDialog?

Verschiedenes zu Qt
Antworten
gk_17
Beiträge: 37
Registriert: 4. Oktober 2009 19:20

Alternativen zu QDialog?

Beitrag von gk_17 »

Moin zusammen,
ich brauche mal eine Anregung zu einem grundsätzlichen Problem mit einem Anwendungsdesign.

Es geht um eine CAD-Anwendung. Großes Fenster mit Geometrie drin. Nutzer soll z.B. was löschen und muss es dazu in CAD-Anzeige auswählen. Der mir bekannte Weg wäre ein Button, den der Nutzer drückt, um das Löschen zu beginnen. In der zu diesem Button gehörenden Methode wird ein Dialog erzeugt und angezeigt, der den Nutzer durch die Auswahl der zu löschenden Daten führt. Wenn fertig, drückt der Nutzer im Dialog auf Ok, Dialog verschwindet und die selektierten Daten werden ausgewertet / gelöscht. Löschmethode zu Ende, alles wieder wie im Ausgangszustand.

Mich stört aber der Dialog. Der ist immer im Weg. Ich will eine Anwendung mit einem zentralen "Dialogbereich", z.B. an der Seite. Vielleicht mit QStackedWidget. Aber ich will auch aus der Löschmethode den Dialog anzeigen und diese blockieren, bis der Nutzer fertig ist und den Dialog bestätigt hat, also wie mit der exec()-Methode von QDialog.

Kann mir jemand dazu einen Denkanstoß geben? Wie blockiere ich eine Anwendung wie bei einem modalen Dialog, ohne dass ich einen verwende?

Vielen Dank!
Gernot
gk_17
Beiträge: 37
Registriert: 4. Oktober 2009 19:20

Re: Alternativen zu QDialog?

Beitrag von gk_17 »

Hm,
ich verstehe leider gar nicht, was Du meinst. Steuerelemente brauche ich natürlich, ich will sie nur nicht in einem (modalen) Dialog anordnen, sondern in einem festen Bereich der Anwendung, aber ich will die Funktionalität des Blockierens der Anwendung haben, wie sie die exec()-Methode eines QDialog bietet.
gk_17
Beiträge: 37
Registriert: 4. Oktober 2009 19:20

Re: Alternativen zu QDialog?

Beitrag von gk_17 »

Alles klar, jetzt habe ich Dich verstanden ;)

Aber inzwischen kann ich besser erklären, was ich will: mir geht es nicht darum, wie bei einem modalen Dialog die restliche Anwendung vorübergehend zu blockieren (was ich ja durch deaktivieren aller anderen Elemente auch erreichen könnte). Mir geht es darum, aus einer Methode heraus das Selektionswidget (wie einen QDialog) anzeigen zu können und in der Methode weitermachen zu können, wenn im Selektionswidget Ok gedrückt wurde. Also so wie ich einen QDialog mit exec() anzeigen würde und erst wenn der Nutzer im Dialog Ok drückt, ist die exec()-Methode beendet und ich kann weitermachen. Nur eben ohne QDialog und auch ohne den Rest der Anwendung (Menü, Grafikbereich) zu blockieren. Jetzt denke ich sofort an einen nichtmodalen Dialog, aber bei dem gibt es ja wieder keine exec()-Methode, sondern nur show().

Also zusammengefasst: die Methode, die z.B. ein Selektionswidget anzeigt, soll warten mit der Ausführung, bis sie vom angezeigten Selektionswidget das ok bekommt. Wie kann man sowas implementieren?
strige
Beiträge: 36
Registriert: 27. Dezember 2009 19:37

Re: Alternativen zu QDialog?

Beitrag von strige »

könnte es funktionieren wenn du anstatt eines QDialogs ein QWidget nimmst, das über setWindowModality ( Qt::WindowModality windowModality ) deine bevorzugte Einstellung bekommt und dieses Widget eben da plazierst wo du es gerne haben möchtest?
Lg Strige
gk_17
Beiträge: 37
Registriert: 4. Oktober 2009 19:20

Re: Alternativen zu QDialog?

Beitrag von gk_17 »

Vielen Dank für eure Mühe mit meinem Problem. Leider hab ichs immer noch nicht richtig geschafft, es klar zu machen ;)
Ich versuche es mal mit Pseudocode.

Code: Alles auswählen

void MainWindow::onDeleteFaces() //wird über Button im Hauptfenster aufgerufen
{
   SelectFacesDialog sfd = new SelectFacesDialog();
   sfd.exec(); //jetzt wird ein Dialog angezeigt, der den Nutzer durch den Auswahlprozess für die zu löschenden faces führt
   //hier an dieser Stelle hat der Nutzer den Dialog beendet und ich werte die selektierten faces aus
   deleteFaces();
}
sowas in der Art will ich, aber ohne QDialog, weil der
1. nicht in das Hauptfenster integriert ist
2. die Anwendung (und damit auch die Auswahl der faces) blockiert, wenn er modal ist
3. wenn er nicht modal ist keine Rückmeldung bietet, wenn er fertig ist (die exec()-Methode ist erst fertig, wenn der Dialog geschlossen wurde)

statt dessen dachte ich an sowas:

Code: Alles auswählen

void MainWindow::onDeleteFaces() //wird wieder über Knopf im Hauptfenster aufgerufen
{
   zeige in einem QStackedWidget ein Widget zur Selektion von faces an (dieses Widget enthält Buttons, u.a. auch einen Ok-Button zum fertig melden)
}

void MainWindow::onSelectWidgetOk() //wird aufgerufen, wenn im SelectWidget Ok gedrückt wurde
{
   //hier könnte ich jetzt auch die selektierten faces löschen
}
Dieser Ansatz gefällt mir überhaupt nicht. Er ist umständlich, nicht verallgemeinerbar für verschiedene Selektionsaufgaben. Ich suche nach einer Möglichkeit, direkt in einer Methode onDeleteFaces() die Selektion zu starten und auch hier die Rückmeldung zu bekommen, dass alles fertig ist
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Alternativen zu QDialog?

Beitrag von franzf »

Was sind "faces"? Warum kann der User nicht einfach in der normalen GUI direkt markieren was er löschen will und dann einfach entf drücken? Wieso soll die Selektion stattfinden, während der Dialog offen ist? Wenn ein Dialog für irgendwas nötig ist, kann man den doch NACH Selektion + "entf" öffnen.
Evtl. sagst du ja mal, für was du den Dialog genau brauchst (und eventuelle Fachausdrücke beschreiben/durch verständliche Ausdrücke ersetzen - nicht jeder lebt in der CAD-Welt...
gk_17
Beiträge: 37
Registriert: 4. Oktober 2009 19:20

Re: Alternativen zu QDialog?

Beitrag von gk_17 »

Ich hab versucht, mein Problem so allgemein wie möglich zu beschreiben.
Faces sind in der CAD-Sprache (von OpenCascade) eine Form von Flächen. Darum geht es aber nicht. Es geht darum, verschiedenste, teilweise komplexe geometrische Gebilde zu selektieren. Dazu muss je nachdem, um was es geht, die Darstellung aufbereitet werden, Teile ausgeblendet werden usw. Dafür hätte ich gerne sowas wie einen eigenen Selektionsbereich, eben ähnlich einem Dialog.

Klar kann ich auch irgendwie selektieren lassen und dann mittels ENTF löschen, passt mir aber nicht ins Konzept. Meine Frage ist einfach nur, wie ich eine Blockierung/Rückmeldung ähnlich der exec()-Methode eines QDialog implementiere.

Ich kanns auch noch ohne CAD beschreiben:
Eine Methode braucht einen Dateinamen. Man könnte jetzt mittels QFileDialog den Namen erfragen und nach der Beendigung des Dialogs, ob nun mit oder ohne Namen in der Methode entsprechend weitermachen. Wenn ich aber statt einem Dialog einfach irgendwo im MainWindow ein Eingabefeld auftauchen lassen möchte, in das der Nutzer den Dateinamen eingibt, wie komme ich dann zurück in die Methode, die den Dateinamen braucht?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Alternativen zu QDialog?

Beitrag von franzf »

Einfach nicht eine Methode nehmen sondern zwei. Die erste legt dir deine Elemente ins Interface - am besten da es nicht stört als QDockWidget. Wenn der User alles zurechtgelegt hat, drückt er einen "OK"-Button. Dessen "clicked()"-Signal hängt an einem Slot (die zweite Methode), in dem a) das eigentlche Löschen stattfindet und b) das DockWidget aus dem Interface wieder entfernt wird. Selbiges Spiel mit einem Cancel-Button, der nur das Interface aufräumt.
gk_17
Beiträge: 37
Registriert: 4. Oktober 2009 19:20

Re: Alternativen zu QDialog?

Beitrag von gk_17 »

Das ist zwar eine Lösung die auf jeden Fall funktioniert, aber ich finde die umständlich. Da würde ich ja für jede Nutzerinteraktion immer zwei Methoden programmieren müssen. Ich frage mich, ob man das nicht eleganter lösen kann. Ich nehme in Kauf, mein ganzes Programm umstrukturieren zu müssen.

Inzwischen würde ich meine Frage auch allgemeiner formulieren. Gibt es denn hier vielleicht jemanden, der CAD-Programme benutzt? So gut wie alle, die ich kenne, arbeiten so, dass vom Nutzer Funktionen aufgerufen werden, die Eingaben verlangen. Während das Programm auf die Eingabe wartet (Zahlen, oder Selektionen im Geometriebereich), bleibt alles andere funktionsfähig: der Geometriebereich, um z.B. die Ansicht ändern zu können, das Menü, um jederzeit einen anderen Befehl aufzurufen usw. Wie wird sowas grundsätzlich gelöst? Wie ist solch ein Programm aufgebaut?

Hat das was mit Threads zu tun?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Alternativen zu QDialog?

Beitrag von RHBaum »

Während das Programm auf die Eingabe wartet (Zahlen, oder Selektionen im Geometriebereich), bleibt alles andere funktionsfähig: der Geometriebereich, um z.B. die Ansicht ändern zu können, das Menü, um jederzeit einen anderen Befehl aufzurufen usw. Wie wird sowas grundsätzlich gelöst? Wie ist solch ein Programm aufgebaut?
Dann Wartet das programm nicht!
Die Formulierung ist irgendwie ungluecklich ....

Fenster, die nicht modal sind (das sind eigentlich alle, die keine eigne Msg-queue haben) liefern dir einfach nur nen weiteren eingabe-bereich und wenn du irgend nen button klickst, wird irgendwas ausgefuehrt.
Das Fenster kann zu jeglicher beliebigen zeit geoffnet und wieder gschlossen werden.
Das hat nix mit multithreading zu tun.

Auf QT ebene, betrifft das jedes WIdget, ausgenommen von QDialog im Modal modus.
Also egal ob die fenster sich in andere integrieren (standard widgets), oder extern mit eigenen Rahmen ... (QWidget, bzw Qdialog im nichtmodalen Modus), oder um fenster mit minimaler fensterdekoration im gruppierten bereich (dock.widgets) etc.

Mach mal mit Qt testweisse irgendwo von deinem MainWIndow aus nen Widget auf, und spiel mit Flags rum.
Dann mach mal nen QDialog, und feuer den nicht mit exec (eigene Msg-Queue), sondern mach einfach mal nen show drauf ....
und irgendwann ruf nen close drauf auf ^^ von aussen !

Ciao ...
Antworten