Close Event des MainForm

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

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
Benutzeravatar
sparrow
User
Beiträge: 4546
Registriert: Freitag 17. April 2009, 10:28

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.
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

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)
Benutzeravatar
__blackjack__
User
Beiträge: 14132
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

@__blackjack__
genau dass habe ich auch gesucht - "anwendungsweite Aufräumaktionen ohne Benutzerinteraktion"
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

... 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
Benutzeravatar
__blackjack__
User
Beiträge: 14132
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was heisst das denn konkret „wird gemäckert“? Kommt da ein kleiner schimpfender Kobold aus dem Rechner gekrabbelt, oder eine Fehlermeldung? Falls ja, welche?
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

... er kennt "Horizontal" nicht

Code: Alles auswählen

self.mod_elog.setHeaderData(0, Qt.Horizontal, "Legedatum")
hatte ich so im Netz gefunden und angepasst.
Benutzeravatar
sparrow
User
Beiträge: 4546
Registriert: Freitag 17. April 2009, 10:28

@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.
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

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
Benutzeravatar
__blackjack__
User
Beiträge: 14132
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

... 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' "
Benutzeravatar
__blackjack__
User
Beiträge: 14132
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

@__blackjack__
bist Du mal so nett und schreibst mal die Zeile Code wie es sein sollte.

Frank
Benutzeravatar
__blackjack__
User
Beiträge: 14132
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DL3AD: Die Zeile war/ist doch gar nicht das Problem. Du musst das richtige `Qt`-Modul importieren.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

... und welches ist das ?
Benutzeravatar
__blackjack__
User
Beiträge: 14132
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DL3AD: Das verrät Dir die Dokumentation.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

Sorry aber ich habe Tomaten auf den Augen.
Ich bin hier und bitte um Hilfe - Welches Qt-Modul ist es denn nun ?
Benutzeravatar
__blackjack__
User
Beiträge: 14132
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
DL3AD
User
Beiträge: 46
Registriert: Montag 31. August 2015, 19:03

... bin nun auf dieser Seite
https://doc.qt.io/qtforpython-6/PySide ... html#more

und dann ?
Antworten