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


von blub (Gast)


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?

von Sven B. (scummos)


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

von blub (Gast)


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.

von Sven B. (scummos)


Lesenswert?

Hab's nicht ausprobiert, aber probier mal
   dataMonitor = self.mdi.activeSubWindow().widget()

von blub (Gast)


Lesenswert?

Funktioniert, vielen Dank!

von blub (Gast)


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?

von Rolf M. (rmagnus)


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?

von Sven B. (scummos)


Lesenswert?

Ohne den Code schwer zu sagen, aber das klingt eh nicht so als ob man 
das machen sollte -- warum machst du das, was willst du damit erreichen?

von blub (Gast)


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.

von Sven B. (scummos)


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

: Bearbeitet durch User
von Rolf M. (rmagnus)


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.

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.