Закрытие MainWindow из основного окна с перехватом события

Как закрыть MainWindow из основного окна чтобы это событие перехватывалось?

При текущем коде из менюбар и кнопкой 'x' все закрывается с перехватом. А из основного окна кнопкой btn закрывается только это окно. Если в btn использовать QtWidgets.qApp.quit то закрывается все приложение, но это событие не перехватывается.

Создавать отдельный closeEvent для основного окна с qApp.quit для закрытия MainWindow?

class MainWindow(QtWidgets.QMainWindow):
  def __init__(self,parent=None):
    QtWidgets.QMainWindow.__init__(self, parent)
    self.win = MyWindow()
    self.setCentralWidget(self.win)
    menuBar = self.menuBar()
    myMenu = menuBar.addMenu('&File')
    action = myMenu.addAction('&Close',  self.close)

  def closeEvent(self, e):
    print('Goodbye')
    e.accept()
    QtWidgets.QWidget.closeEvent(self, e)

class MyWindow(QtWidgets.QWidget):
  def __init__(self,parent=None):
    QtWidgets.QWidget.__init__(self, parent)
    self.makeWidget()

  def makeWidget(self):
    btn = QtWidgets.QPushButton('Close')
    btn.clicked.connect(self.close)

if __name__ == '__main__':
  app = QtWidgets.QApplication(sys.argv)
  window = MainWindow()
  window.show()
  sys.exit(app.exec_())

Ответы (2 шт):

Автор решения: Alexander Chernin

Если я правильно понял вашу проблему, то попробуйте так:

class MyWindow(QtWidgets.QWidget):
  def __init__(self,parent=None):
    QtWidgets.QWidget.__init__(self, parent)
    self.makeWidget()

  def makeWidget(self):
    self.btn = QtWidgets.QPushButton('Close') # не забудьте self

Тогда в главном окне надо добавить строку:

class MainWindow(QtWidgets.QMainWindow):
  def __init__(self,parent=None):
    QtWidgets.QMainWindow.__init__(self, parent)
    self.win = MyWindow()
    self.win.btn.connect(self.close) # На кнопку вешаем закрытие главного окна
    ...
→ Ссылка
Автор решения: S. Nick

Как вариант:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class MyWindow(QtWidgets.QWidget):
    def __init__(self,parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        self.makeWidget()

    def makeWidget(self):
        btn = QtWidgets.QPushButton('Close')
        btn.clicked.connect(self.window().close)                        # +++

        layout = QtWidgets.QVBoxLayout(self)                            # +++
        layout.addWidget(btn)                                           # +++


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)

        self.win = MyWindow(self)                                       # + self
        self.setCentralWidget(self.win)

        menuBar = self.menuBar()
        myMenu = menuBar.addMenu('&File')
        action = myMenu.addAction('&Close',  self.close)

    def closeEvent(self, e):
        print('Goodbye')
        e.accept()
        QtWidgets.QWidget.closeEvent(self, e)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка