PyQt4: Wie alle Widgets Fensters nicht editierbar schalten?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Tamtam
User
Beiträge: 7
Registriert: Donnerstag 29. Januar 2009, 15:55

Hallo,

möchte mit einem Button (bzw Funktion) alle Widgets eines Fensters (bis auf eines) für Veränderungen sperren bzw wieder alle aktivieren. Also zwischen einem Anzeigemodus und Editiermodus umschalten. Muss ich dazu alle Widgets einzeln schalten?

Grüße,

Tamtam
lunar

Das kommt darauf an. Wenn die zu deaktivierenden Widgets in einem einzigen Widget enthalten sind, kannst du dieses einfach deaktivieren, dann werden alle Kinder bzw. alle enthaltenen Widgets automatisch deaktiviert.

Wenn deine Widgets dagegen wild verstreut sind, musst du sie wohl oder übel alle einzeln deaktivieren. Woher sollte Qt4 denn auch wissen, welche Widgets deaktiviert werden sollten?
Tamtam
User
Beiträge: 7
Registriert: Donnerstag 29. Januar 2009, 15:55

lunar hat geschrieben:Wenn die zu deaktivierenden Widgets in einem einzigen Widget enthalten sind, kannst du dieses einfach deaktivieren, dann werden alle Kinder bzw. alle enthaltenen Widgets automatisch deaktiviert.
Danke. Alle Widgets sind in einem Container.

Ich entwerfe gerade meine erste Qt Oberfläche. Ich hatte die Idee die Dialoge mit einem Schalter zwischen <Nur Anzeigen> und <Ändern> umschalten zu können. Das geht im Prinzip auch, die nicht editierbare Widgets werden aber automatisch grau dargestellt. Das ist in diesem Fall jedoch nicht gewünscht. :(

Falls sonst niemand einen Vorschlag hat, werde ich einen anderen Weg finden müssen, unbeabsichtigte Änderungen an den Daten abzufangen.

Grüße,

Tamtam
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mach doch einfach zwei Listen: eine welche die Elemente enhält, die für "nur anzeigen" verantwortlich sind und die zweite mit "ändern". Dann Aktionen auf allen Elementen einr Liste durchführen ist geschenkt.
Tamtam
User
Beiträge: 7
Registriert: Donnerstag 29. Januar 2009, 15:55

Hallo EyDu,

habe die Auswahl der Widgets für aktivieren und deaktivieren über einen Container im Griff. Eine Liste wäre auch eine Möglichkeit gewesen. Allerdings werden die Widgets automatisch ausgegraut. Das würde ich gerne vermeiden. Sehe aber nichts in den API.

Grüße

Tamtam
lunar

Tamtam hat geschrieben:habe die Auswahl der Widgets für aktivieren und deaktivieren über einen Container im Griff. Eine Liste wäre auch eine Möglichkeit gewesen. Allerdings werden die Widgets automatisch ausgegraut. Das würde ich gerne vermeiden.
Und warum? Standards für GUI-Design existieren aus guten Gründen. Ein Benutzer weiß, dass ausgegraute Widgets nicht benutzt werden können, ebenso wie er erwartet, dass normal gezeichnete Widgets sinnvoll benutzt werden können. Wenn du die Widgets deaktivierst (z.B. in dem du eigene Widgets erstellst, die ihre Eingabe verwerfen) ohne diesen Zustand optisch anzuzeigen, führt das nur zur Verwirrung den Benutzern deiner Benutzeroberfläche.

Deine zwei einfachen und sinnvollen Alternativen sind zum einen das – offenbar ungewollte – Deaktivieren der Widgets, oder sie mit ".hide()" bzw. ".setVisible(False)" auszublenden. Andere Lösungen sind zwar möglich, aber aufwendiger und im Sinne der Konsistenz mit anderen Oberflächen auch zu vermeiden.
Tamtam
User
Beiträge: 7
Registriert: Donnerstag 29. Januar 2009, 15:55

lunar hat geschrieben:Standards für GUI-Design existieren aus guten Gründen. Ein Benutzer weiß, dass ausgegraute Widgets nicht benutzt werden können, ebenso wie er erwartet, dass normal gezeichnete Widgets sinnvoll benutzt werden können. Wenn du die Widgets deaktivierst (z.B. in dem du eigene Widgets erstellst, die ihre Eingabe verwerfen) ohne diesen Zustand optisch anzuzeigen, führt das nur zur Verwirrung den Benutzern deiner Benutzeroberfläche.
Ich stimme Dir bei Deinen Argumenten zu und halte den eingeschlagenen Weg auch nicht für ideal, finde aber derzeit keinen besseren Kompromiss.

Es geht um die Darstellung von Daten aus einer Datenbank. Es gab folgende Überlegungen bei der Konzeption der Masken:

1. Zur Vereinfachung für die Nutzer sollen die Präsentation der Daten in demselben Layout erfolgen, in dem Änderungen gemacht werden.

2. In knapp 80 Prozent der Fälle werden Daten nur angezeigt und Änderungen sind unerwünscht (passierte bei der alten Software aber immer wieder mal unbeabsichtigt und sei es nur der Kugelschreiber, der auf die Tastatur fällt).

Also kamen wir auf folgende Idee: Anzeige der Daten in Masken, die Lineedits, Combobox etc so verwenden wie die Eingabemaske. Einen globalen Schalter zum Freischalten der Maske für die Bearbeitung.


lunar hat geschrieben:Deine zwei einfachen und sinnvollen Alternativen sind zum einen das – offenbar ungewollte – Deaktivieren der Widgets, oder sie mit ".hide()" bzw. ".setVisible(False)" auszublenden. Andere Lösungen sind zwar möglich, aber aufwendiger und im Sinne der Konsistenz mit anderen Oberflächen auch zu vermeiden.
- Hide/Verstecken eben nicht, weil wir ja anzeigen wollen.
- Inaktiv / Grau wäre akzeptabel aber unschön und auf Dauer schwer zu lesen.

Eine weitere Möglichkeit wäre die Anzeige der Daten mit Textlabels und das Öffnen eines extra Eingabedialogs oder das Ersetzen der statischen Labels durch aktive Eingabefelder. Könnte mir aber vorstellen, dass dies die Benutzer noch mehr verwirrt bzw. den Arbeitsfluss stört.

So wie es momentan aussieht werden wir wohl wieder auf einen ungeschützten Editierdialog für die Anzeige der Daten und eine Sicherungsabfrage vor dem Speichern zurückgreifen, wie wir es bei der alten Lösung schon hatten. Zwar nicht optimal, aber einfach zu implementieren.

Grüße,

Tamtam
lunar

Jetzt verstehe ich dein Ansinnen. Nun, bei QLineEdit gibt es z.B. die Eigenschaft "readOnly", mit denen du die Bearbeitung verhindern kannst. Bei anderen Widgets mag es ähnliche Eigenschaften geben, aber da müsste ich jetzt selbst nachsehen. Diese Eigenschaft gehört aber nicht zu einem QWidget, so dass du sich nicht auf den allgemeinen Container anwenden kannst. Du musst also in der Tat jedes Kindwidgets manuell umschalten, allerdings hält die Klasse QObject Methoden bereit, um über die Kinder eines Objekts zu iterieren.
Antworten