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

Gast #3828194
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
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.