Seite 1 von 2

Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 09:14
von DL3AD
Hallo in die Runde,
bin nun endgültig von Objekt Pascal zu Python umgestiegen - macht echt Spass und komme auch gut vorwärts.
Brauch nun aber mal einen Tipp von Euch.
Wenn ich das Program beende (X rechts oben) dann muss ich gelegendlich noch einege Aktionen durchführen wie z.B. noch was wegspeichern, nen Port schließen oder...
Bei Objekt Pascal gab es das Close - Event.
Wie mache ich das in Python ?
Ich hänge mal etwas Code an.

Code: Alles auswählen

# Hauptfenster der Anwendung ==================================================
#
from PySide6.QtWidgets import QMainWindow
from PySide6 import QtSql
from frm_main_ui import Ui_frm_main

class FrmMain(QMainWindow, Ui_frm_main):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()
        # Datenbankverbindung herstellen
        self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("Eierlog.sqlite")
        # Daten in der Tabelle anzeigen
        self.mod_elog = QtSql.QSqlRelationalTableModel()
        self.mod_elog.setTable("tab01")
        self.mod_elog.select()
        self.tableView.setModel(self.mod_elog)
        self.btn_buchen.clicked.connect(self.eier_buchen)

    def eier_buchen(self):
        print("eier_buchen")
Ich suche in etwa eine Lösung so wie das mit dem "clicked.connect" auf eine def in der ich dann die Aktionen reinpacken kann.
... is bestimmt total banal - stehe aber auf dem Schlauch.

Frank

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 09:45
von sparrow
Eigentlich ist die Frage nicht, wie du das in Python machst, sonder wie du das in Qt 6 bzw. Pyside 6 machst.

Qt kennt das QCloseEvent. Dort wird auch das Signal beschrieben, das gefeuert wird, sobal das letzte Fenster der Anwendung geschlossen werden soll.

Für dich der einfachste Weg: QMainWindow erbt von QWidget und das hat eine closeEvent Methode, die du überschreiben kannst, um das Verhalten beim Schließen zu ändern.
Diese Methode ist standardmäßig das Ziel eines QWidgets, wenn das Event ausgelöst wird.

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 10:07
von DL3AD
Danke !

Code: Alles auswählen

# Hauptfenster der Anwendung ==================================================
#
from PySide6.QtWidgets import QMainWindow
from PySide6 import QtSql
from frm_main_ui import Ui_frm_main

class FrmMain(QMainWindow, Ui_frm_main):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()
        # Datenbankverbindung herstellen
        self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("Eierlog.sqlite")
        # Daten in der Tabelle anzeigen
        self.mod_elog = QtSql.QSqlRelationalTableModel()
        self.mod_elog.setTable("tab01")
        self.mod_elog.select()
        self.tableView.setModel(self.mod_elog)
        self.btn_buchen.clicked.connect(self.eier_buchen)

    def eier_buchen(self):
        print("eier_buchen")

    def closeEvent(self, event):
        print("closeEvent gefeuert")

So wollte ich es 8)

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 10:28
von __blackjack__
Weil sparrow was vom letzten Fenster schliessen schrieb: das wäre dann eher das `aboutToQuit()`-Signal vom `QCoreApplication`. Da kann man anwendungsweite Aufräumaktionen mit verknüpfen, die allerdings keine Benutzerinteraktion über die GUI mehr zulassen.

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 10:50
von DL3AD
@__blackjack__
genau dass habe ich auch gesucht - "anwendungsweite Aufräumaktionen ohne Benutzerinteraktion"

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 17:00
von DL3AD
... habe da noch ein kleines Problem.
Ich möchte die Spaltenbezeichnung ändern - in der Tabelle der Datenbank steht Datum - das TableView soll aber Legedatum anzeigen.
Nun habe ich versucht das im Model zu ändern - was mache ich da falsch ?

Code: Alles auswählen

# Hauptfenster der Anwendung ==================================================
#
from PySide6.QtWidgets import QMainWindow
from PySide6 import QtSql, Qt, QtCore, QtGui
from frm_main_ui import Ui_frm_main

class FrmMain(QMainWindow, Ui_frm_main):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()
        # Datenbankverbindung herstellen
        self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("Eierlog.sqlite")
        # Daten in der Tabelle anzeigen
        self.mod_elog = QtSql.QSqlTableModel()
        self.mod_elog.setTable("tab01")

        # In dieser Zeile wird gemäckert bei Horizontal
        self.mod_elog.setHeaderData(0, Qt.Horizontal, "Legedatum")

        self.mod_elog.select()
        self.tableView.setModel(self.mod_elog)
        self.btn_buchen.clicked.connect(self.eier_buchen)

    def eier_buchen(self):
        print("eier_buchen")

    def closeEvent(self, event):
        print("closeEvent gefeuert")
Frank

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 18:31
von __blackjack__
Was heisst das denn konkret „wird gemäckert“? Kommt da ein kleiner schimpfender Kobold aus dem Rechner gekrabbelt, oder eine Fehlermeldung? Falls ja, welche?

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 19:07
von DL3AD
... er kennt "Horizontal" nicht

Code: Alles auswählen

self.mod_elog.setHeaderData(0, Qt.Horizontal, "Legedatum")
hatte ich so im Netz gefunden und angepasst.

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 19:41
von sparrow
@DL3AD: Bitte zeige immer den Code, den du ausführst, und die dazugehörige Fehlermeldung. Das ist für alle einfacher. Du musst dir keine Beschreibung ausdenken und die Helfenden müssen sich nicht überlegen, was du meinst.

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 20:02
von DL3AD
die Fehlermeldung lautet:
Referenz 'Horizontal' kann in 'inported module PySide6.Qt' nicht gefunden werden

Ich möchte die Spaltenbezeichnung ändern - in der Tabelle der Datenbank steht Datum aber In der Gui in der Tabeview soll Legedatum stehen.
Ob mein Ansatz richtig ist kann ich leider nicht beurteilen.

Frank

Re: Close Event des MainForm

Verfasst: Sonntag 7. September 2025, 20:54
von __blackjack__
@DL3AD: Du hast da das falsche Qt. Nicht irgendwo im Netz was finden, sondern in der PySide6-Dokumentation nachschauen. Da kann man sich die Dokumentation zur Methode raus suchen und da auf den Typ von dem Argument klicken, und schon sieht man wo das definiert ist.

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 07:03
von DL3AD
... genau dass hatte ich gemacht.
https://doc.qt.io/qtforpython-6/PySide ... odel.html

Da steht aber auch:

Warning

This section contains snippets that were automatically translated from C++ to Python and may contain errors.

Ich versuche schon Zielgenau zu suchen.
Bleibt die Frage was mache ich falsch.

Code: Alles auswählen

self.mod_elog.setHeaderData(0, Qt.Horizontal,  tr("Legedatum"))
Habe ich versucht - da sagt er dann "Nicht aufgelöste Referenz: 'tr' "

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 09:03
von __blackjack__
@DL3AD: Warum hast Du die `tr()`-Funktion denn benutzt? Die hat doch gar nichts mit dem zweiten Argument zu tun? Die Funktion ist nicht bei den in Python ”eingebauten” Funktionen, also muss man die importieren — falls man die überhaupt benutzen möchte. Das ist in C++ nicht anders. ``#include`` in C++ funktioniert ein bisschen anders als ``import`` in Python, aber einfach so vom Himmel fallen Konstanten, Funktionen, und Klassen in C++ auch nicht. Soweit ich das sehe enthält der Code-Schnippsel dort keine ”Übersetzungsfehler”.

Ich meinte die Dokumentation von `setHeaderData()`. Das ist ja nicht auf `QSqlTableModel` definiert, da muss man die Vererbungshierarchie rauf bis zu der Klasse wo die Methode definiert ist. Und dort dann welchen Typ das `orientation`-Argument hat und verlinkt in welchem Modul das zu finden ist.

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 09:33
von DL3AD
@__blackjack__
bist Du mal so nett und schreibst mal die Zeile Code wie es sein sollte.

Frank

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 10:23
von __blackjack__
@DL3AD: Die Zeile war/ist doch gar nicht das Problem. Du musst das richtige `Qt`-Modul importieren.

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 10:32
von DL3AD
... und welches ist das ?

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 10:52
von __blackjack__
@DL3AD: Das verrät Dir die Dokumentation.

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 11:04
von DL3AD
Sorry aber ich habe Tomaten auf den Augen.
Ich bin hier und bitte um Hilfe - Welches Qt-Modul ist es denn nun ?

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 11:14
von __blackjack__
@DL3AD: An welchem Punkt kommst Du denn bei der Suche nicht weiter? Von `QSqlTableModel` ausgehend die Klasse finden auf der `setHeaderData()` definiert ist, und bei der Dokumentation dieser Methode dann auf den Datentyp für das zweite Argument klicken, und Du bist in der Dokumentation des Moduls und da sieht man dann auch wo das her kommt.

Es bringt mehr wenn Du lernst Dich in der Dokumentation zurecht zu finden, als die Lösung jetzt hier ohne den Weg zu präsentieren, denn sonst kommst Du ja auch beim nächsten mal nicht ohne Hilfe weiter wenn so etwas ähnliches auftritt.

Re: Close Event des MainForm

Verfasst: Montag 8. September 2025, 11:30
von DL3AD
... bin nun auf dieser Seite
https://doc.qt.io/qtforpython-6/PySide ... html#more

und dann ?