Auslesen vom Editinhalt einer anderen Klasse (QT)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
3cosystem
User
Beiträge: 22
Registriert: Mittwoch 22. April 2020, 14:48

Hallo Leute,

ich moechte ein Gui mit Tabs erstellen, die einige Elemente beinhalten.
Jeder Tab ist zur besseren Ansprechung in einer neuen Klasse.
Nach der Initiierung moechte ich auf den Status oder den Inhalt der Elemente zugreifen, um damit zu arbeiten.
Mittels return bekomme ich (natuerlich) nur den Status vor der Initiierung, aber nicht den der manuellen Veraenderung.
Wie greife ich auf den neuen Inhalt oder Status aus einer anderen Klasse zu?

In meinem Beispiel soll der Print-Button den Inhalt des Edits ausgeben.
Auch wenn ich diesen im GUI nachtraeglich geaendert habe.
Zur Zeit bekomme ich nur den Inhalt vor der Initiierung.

Eine Ueberlegung:
Mittels signal ".textChanged" des Edits den Inhalt mittels configparser abzuspeichern und den Inhalt der .ini
ueber den print button wieder abzufragen. Vielleicht geht das eleganter.

Ich weiß, ich keonnte den Tab und das Edit einfach in der MainKlasse erstellen. Das stellt fuer mich aber keine Loesung dar...

Vielen Dank im Voraus
VG 3cosystem

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import sys
from PyQt5 import QtWidgets


class Ui_MainWindow(QtWidgets.QDialog):
    def __init__(self, master=None):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setWindowTitle("Printen, was im Edit steht.")
        box = QtWidgets.QVBoxLayout()

        tabWidget = QtWidgets.QTabWidget()
        self.btn_print = QtWidgets.QPushButton("print")
        self.btn_print.clicked.connect(self.print)
        tabelemente = tab()    # creating an object of tabinhalt (instance), has all the functions

        tabWidget.addTab(tabelemente, "Erster Tab")  
        self.editinhalt = tabelemente.getedittext()

        box.addWidget(tabWidget)
        box.addWidget(self.btn_print)

        self.setLayout(box)

    def print(self):
        print(self.editinhalt)


class tab(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.edit = QtWidgets.QLineEdit(self)
        self.edit.setText("Hallo")

    def getedittext(self):
        return self.edit.text()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = Ui_MainWindow()
    MainWindow.show()
    sys.exit(app.exec_())
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`editinhalt` ist falsch, denn das liefert dir ja nur den Inhalt nach der Initialisierung, also "Hallo". Du mußt schon in `print` auf tablement.getedittext zugreifen.
Klassen schreibt man sowohl in Qt-Notation als auch in Python mit großem Anfangsbuchstaben. Die setupUI-Methode ist überflüssig, weil das könnte man auch direkt in __init__ schreiben. `Ui_MainWindow` ist mehr als Ui, sollte also `MainWindow` heißen, dann muß man sich unten natürlich an die Namenskonvention halten und MainWindow main_window nennen.
3cosystem
User
Beiträge: 22
Registriert: Mittwoch 22. April 2020, 14:48

Sirius3 hat geschrieben: Montag 26. Oktober 2020, 09:24 `editinhalt` ist falsch, denn das liefert dir ja nur den Inhalt nach der Initialisierung, also "Hallo". Du mußt schon in `print` auf tablement.getedittext zugreifen.
Klassen schreibt man sowohl in Qt-Notation als auch in Python mit großem Anfangsbuchstaben. Die setupUI-Methode ist überflüssig, weil das könnte man auch direkt in __init__ schreiben. `Ui_MainWindow` ist mehr als Ui, sollte also `MainWindow` heißen, dann muß man sich unten natürlich an die Namenskonvention halten und MainWindow main_window nennen.
Hallo Sirius3,

danke fuer deine Antwort.
Mit der Qt-Notation hast du natuerlich recht...

Mit self.editinhalt = tabelemente.getedittext() dachte ich, waere da dann schon zugegriffen.
'print' verwendet doch dann tabelemente.getedittext().
Kannst du mir da bitte auf die Spruenge helfen, wo genau ich da ansetzen muss?
Bzw. Kann ich auf den Inhalt auch ohne return-Funktion zugreifen?
VG
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

.getedittext() gibt dir den Inhalt des Textfeldes zurück. Das bindest du an self.editinhalt
Warum sollte der Inhalt von self.editinhalt sich anschließend automatisch verändern?
Um den aktualisierten Inhalt des Textfeldes zu bekommen, musst du dann, wenn du ihn dann, wenn du ihn haben willst, entsprechend wieder mit .getedittext() abrufen.
3cosystem
User
Beiträge: 22
Registriert: Mittwoch 22. April 2020, 14:48

sparrow hat geschrieben: Montag 26. Oktober 2020, 10:01 .getedittext() gibt dir den Inhalt des Textfeldes zurück. Das bindest du an self.editinhalt
Warum sollte der Inhalt von self.editinhalt sich anschließend automatisch verändern?
Um den aktualisierten Inhalt des Textfeldes zu bekommen, musst du dann, wenn du ihn dann, wenn du ihn haben willst, entsprechend wieder mit .getedittext() abrufen.
Danke fuer die Antwort.
Es kann sich nicht veraendern. Das stimmt.
Allerdings ist das ja mein Ausgangsproblem, dass ich nicht weiß, an welcher Stelle ich "wieder" mit .getedittext() abrufe, um den aktuellen Status zu bekommen.

Edit: Oh, vermutlich so?

Code: Alles auswählen

def print(self):
        self.editinhalt = self.tabelemente.getedittext()
        print(self.editinhalt)
Zuletzt geändert von 3cosystem am Montag 26. Oktober 2020, 10:36, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

3cosystem hat geschrieben: Montag 26. Oktober 2020, 10:32 Allerdings ist das ja mein Ausgangsproblem, dass ich nicht weiß, an welcher Stelle ich "wieder" mit .getedittext() abrufe, um den aktuellen Status zu bekommen.
Die Stelle ist doch klar: dort wo Du den aktuellen Status brauchst, also in Deiner print-Methode.
Antworten