pyqt - MDI-Fenster automatisch schließen

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
Nobuddy
User
Beiträge: 820
Registriert: Montag 30. Januar 2012, 16:38

Freitag 11. Januar 2019, 13:02

Hallo zusammen,

versuche mich in pyqt-MDI einzuarbeiten.
Das Öffnen und Schließen der SubWindows funktioniert.
Nun möchte ich nach dem das Hauptfenster (SubWindow) im MDI geschlossen ist, dass das MDI-Fenster automatisch geschlossen wird.
Eine Möglichkeit habe ich schon gefunden, die funktioniert (closeEvent, siehe Code), leider muss ich dazu selbst aktiv werden, um dass das MDI-Fenster geschlossen wird.
Ich habe auch über den eventFilter, verucht das hin zubekommen, doch das funktioniert leider nicht.
Würde mich freuen, wenn Ihr mir dabei helfen könnt!

Ich poste hier mal den Code:

Code: Alles auswählen

class MainWindow(QtGui.QMainWindow):
        
    def __init__(self, title, dataList, header, columnWidths, *args):
        super(MainWindow, self).__init__()
        self.setWindowTitle("MDI demo")
        self.installEventFilter(self)
        self.mdi_area = QtGui.QMdiArea()
        self.mdi_area.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        self.mdi_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        # First SubWindow
        window = Window(self.mdi_area, title, dataList, header, columnWidths)
        self.mdi_area.addSubWindow(window)
        self.setCentralWidget(self.mdi_area)
        # Resize SubWindow to CentralWidget
        self.mdi_area.tileSubWindows()

    def closeEvent(self, event):
        result = QtGui.QMessageBox.question(self,
                      "Confirm Exit...",
                      "Are you sure you want to exit ?",
                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)
        event.ignore()
        if result == QtGui.QMessageBox.Yes:
            event.accept()

    def eventFilter(self, widget, event):
        if event.type() == QtCore.QEvent.KeyPress and widget is self:
            key = event.key()
            if key == QtCore.Qt.Key_Escape:
                #QtGui.QCloseEvent(event)
                event.accept()
            elif key in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
                #self.datasetView()
                pass
            return True
        return QtGui.QWidget.eventFilter(self, widget, event)
Grüße Nobuddy
Nobuddy
User
Beiträge: 820
Registriert: Montag 30. Januar 2012, 16:38

Freitag 11. Januar 2019, 15:37

Ich habe versucht, beim Betätigen der Escape-Taste, den Event an "closeEvent" weiterzuleiten. Funktioniert aber nicht, da der Event eine QEventKey -Klasse ist.
closeEvent, benötigt aber die QCloseEvent -Klasse, damit mit event.accept() das MDI-Fenster geschlossen wird.
Bin ich da auf dem Holzweg und es gibt eine einfachere Lösung?
Nobuddy
User
Beiträge: 820
Registriert: Montag 30. Januar 2012, 16:38

Freitag 11. Januar 2019, 17:43

Tatsächlich, gibt es da eine einfache Lösung, die ich beim Googeln schon öfters gelesen aber nicht so richtig wahr genommen habe.

Code: Alles auswählen


    def closeEvent(self, event):
        result = QtGui.QMessageBox.question(self,
                      "", "Programm beenden?",
                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)
        event.ignore()
        if result == QtGui.QMessageBox.Yes:
            event.accept()

    def eventFilter(self, widget, event):
        if event.type() == QtCore.QEvent.KeyPress and widget is self:
            key = event.key()
            if key == QtCore.Qt.Key_Escape:
                self.close()
            return True
        return QtGui.QWidget.eventFilter(self, widget, event)
In Verbindung mit closeEvent, erhalte ich mit self.close() ein Abfragfenster.
Entferne ich closeEvent aus dem Code in MainWindow, wird MDI-Fenster sofort nach dem Betätigen der Escape-Taste geschlossen.
Wobei ich zu ersterer Lösung tendiere!
Antworten