Qt: Zugriff auf Funktionen von subWindows(QMdiArea), Verändern von Layouts während der Laufzeit?

Gast #3828194
Lesenswert?
• ▲
▼
Ich habe ein Problem Funktionen von SubWindows aufzurufen:

Aus meiner Hauptdatei:
1
self.mdi = QMdiArea()
2
self.setCentralWidget(self.mdi)
Funktion zur Erstellung eines neuen subWindows. Funktioniert 
einwandfrei.
1
def create_new_monitor(self):
2
   dataMonitor = datamonitor_advanced.DataMonitor()
3
   self.mdi.addSubWindow(dataMonitor)
4
   dataMonitor.show()


DataMonitor ist eine Klasse die von QDialog erbt:
Jetzt möchte ich eine Funktion aufrufen:
1
def start_monitor(self):
2
   dataMonitor = self.mdi.activeSubWindow()
3
   dataMonitor.monitor_on()

Bei Aufruf der Funktion bekommeich die Fehlermeldung:

AttributeError: 'QMdiSubWindow' object has no attribute 'monitor_on'

Warum macht der Konstruktor von der Klasse DataMonitor keine Probleme 
aber eine andere Klssenfunktion?

Meine zweite Frage ist, ob man ein Layout während der Laufzeit verändern 
kann. Z.B. wenn Button A gedrückt wird verschwindet LineEdit B?
#3828244
Lesenswert?
• ▲
▼
Lies mal die Doku für QMdiArea::addSubWindow: das übergebene Widget ist 
nicht das Subwindow selbst, das wird nochmal gewrappt. Deshalb kriegst 
du das auch nicht direkt wieder zurück über den Getter.

Zur zweiten Frage: Ja, das geht, die Layouts haben Funktionen um Widgets 
zu entfernen und Widgets kann man auch verstecken. Die generelle 
Vorgehensweise ist aber, das nicht zu tun. Entweder man hat komplett 
neue UI, die man bei einem bestimmten Ereignis aktivieren will; dann 
verwendet man ein QTabWidget oder ein QStackedWidget. Oder man will nur 
ein, zwei Felder deaktivieren oder aktivieren; dann deaktiviert man die 
Elemente einfach (setEnabled(false)), versteckt sie aber nicht, das ist 
für den Benutzer viel übersichtlicher, weil nicht ständig alles 
flackert. Optimalerweise gibt's noch einen Tooltip, warum das Feld 
deaktiviert ist.

Viele Grüße,
Sven
Gast #3828260
Lesenswert?
• ▲
▼
Danke für die Anwort. Was wäre denn eine Lösung für das erste Problem? 
Ich habe die Programmiermethodik eigentlich 1 zu 1 aus einem Buch 
übernommen. Allerdings benutzen sie dort als subWindow ein QTextEdit. 
Ich habe zu wenig Ahnung von Qt um zu beurteilen, ob das irgeneinen 
Unterschied macht.
Gast #3834651
Lesenswert?
• ▲
▼
Hallo,

ich hätte noch einmal eine ergänzende Frage zum removeWidget Befehl. 
Wenn ich z.B. ein QLabel von einem Layout entferne, ihm einen neuen 
Inhalt zuweise und wieder in das Layout einfüge, wirkt es auf mich so 
als würden zwei Label übereinander liegen, eins mit dem alten und eins 
mit dem neuen Inahlt? Kann das sein bzw, wo könnte der Fehler liegen?
#3834938
Lesenswert?
• ▲
▼
blub schrieb:
> Wenn ich z.B. ein QLabel von einem Layout entferne, ihm einen neuen
> Inhalt zuweise und wieder in das Layout einfüge, wirkt es auf mich so
> als würden zwei Label übereinander liegen, eins mit dem alten und eins
> mit dem neuen Inahlt? Kann das sein bzw, wo könnte der Fehler liegen?

Sollte eigentlich nicht, aber wozu entfernst du es überhaupt aus dem 
Layout?
Gast #3837113
Lesenswert?
• ▲
▼
Ich erzeuge in meiner QMdiArea Fenster die von einer Klasse abgeleitet 
werden. In das neue Fenster sollen Parameter über Textboxen und 
Comboboxen eingegebn werden. Sind die Daten eingegeben sollen dies 
verschwinden. Will man die Parameter ändern soll wieder eine 
Eingabemöglichkeit erscheinen. Ich habe es schon mit zusätlichen 
Popupfenstern probiert, aber das hat nicht richtig funktioniert. Das 
jetzige funktioniert technisch immerhin, nur grafisch leider nicht.
Bin aber auch für Vorschläge offen. Wie gesagt ich habe vorher noch nie 
in Qt programmiert bzw. etwas mit GUI Programmierung zutun gehabt.
#3837144
Lesenswert?
• ▲
▼
Nimm ein QStackedWidget bei dem eine Seite das Formular ist und die 
andere leer.

http://qt-project.org/doc/qt-4.8/qstackedwidget.html

Für das Bearbeiten erzeuge nicht neue Widgets sondern ändere nur den 
Inhalt der alten.

Wenn du mehrere verschiedene Formulare brauchst, füge einfach dem 
QStackedWidget weitere Seiten hinzu.

Das Entfernen von Widgets aus Layouts ist eine totales 
Corner-Case-Feature und wird in normalen Anwendungen so gut wie nie 
verwendet.

Grüße,
Sven
#3838067
Lesenswert?
• ▲
▼
blub schrieb:
> Ich erzeuge in meiner QMdiArea Fenster die von einer Klasse abgeleitet
> werden. In das neue Fenster sollen Parameter über Textboxen und
> Comboboxen eingegebn werden. Sind die Daten eingegeben sollen dies
> verschwinden.

Warum? So kann man ja gar nicht mehr sehen, was man eingegeben hat.
Abgesehen davon solltest du sie mit hide() verschwinden lassen. Aus dem 
Layout zu entfernen, sorgt nur dafür, daß seine Position und Größe nicht 
mehr vom Layout verwaltet werden.

> Will man die Parameter ändern soll wieder eine Eingabemöglichkeit
> erscheinen.

So recht kann ich mir nicht vorstellen, wie das aussieht oder was das 
bringt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren