Как работать с кнопкой X Close в Multiple QMainWindow? - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь создать простую программу с использованием PyQt5 с FBS-фреймворком для ее развертывания. Я успешно создал несколько окон QMainWindow, которые открываются при нажатии кнопки. Но у меня есть проблема при закрытии программы с помощью кнопки X Close, я думаю, потому что обработчик выбрал неправильное MainWindow или ответ не идет в правильном направлении.

Это текущая ошибка (FBS Run не полностьюЗакрыто):

enter image description here

Я пытаюсь преобразовать QMainWindow в QWidget, но этот подход неудачен.

Вот примеркод каждой функции.

Main.py

# Application
class AppContext(ApplicationContext):
    def run(self):
        controller = Control.Controller()
        controller.show_MainWindow()
        return self.app.exec_()

# Main Application
if __name__ == '__main__':
    appctxt = AppContext()
    exit_code = appctxt.run()
    sys.exit(exit_code)

Controller.py

class Controller():
    def __init__(self):
        pass

    def show_MainWindow(self):
        self._MainWindow = MW.MainWindow()
        self._MainWindow.switch_window.connect(self.change_InputWindows)
        self._MainWindow.show()

    def change_InputWindows(self, text):
        if(text == "ICW"):
            self._ICWWindow = ICW.IronCathWindowLay()
            self._ICWWindow.switch_window.connect(self.change_OutputWindows)
            self._MainWindow.close()
            self._ICWWindow.show()

        elif(text == "SCW"):
            self._SCWWindow = SCW.SteelCathWindowLay()
            self._SCWWindow.switch_window.connect(self.change_OutputWindows)
            self._MainWindow.close()
            self._SCWWindow.show()

        elif(text == "ITW"):
            self._ITWWindow = ITW.IronThicWindowLay()
            self._ITWWindow.switch_window.connect(self.change_OutputWindows)
            self._MainWindow.close()
            self._ITWWindow.show()

        elif(text == "STW"):
            self._STWWindow = STW.SteelThicWindowLay()
            self._STWWindow.switch_window.connect(self.change_OutputWindows)
            self._MainWindow.close()
            self._STWWindow.show()


    def change_OutputWindows(self, text):
        if(text == "HICW"):
            self._ICWWindow.close()
            self.show_MainWindow()

        elif(text == "HSCW"):
            self._SCWWindow.close()
            self.show_MainWindow()

        elif(text == "HITW"):
            self._ITWWindow.close()
            self.show_MainWindow()

        elif(text == "HSTW"):
            self._STWWindow.close()
            self.show_MainWindow()

MainWindow.py

class MainWindow(QMainWindow):
    switch_window = QtCore.pyqtSignal(str)

    # Main Window
    def __init__(self):
        super(MainWindow, self).__init__()
        loadUi(ApplicationContext().get_resource('MainLayout.ui'), self)

        # Button Handler
        self.ironCathodicButton.clicked.connect(self.createICW)
        self.ironThicknessButton.clicked.connect(self.createITW)
        self.steelCathodicButton.clicked.connect(self.createSCW)
        self.steelThicknessButton.clicked.connect(self.createSTW)

    # Button Function
    @pyqtSlot()
    def createICW(self):
        self.switch_window.emit("ICW")

    @pyqtSlot()
    def createITW(self):
        self.switch_window.emit("ITW")

    @pyqtSlot()
    def createSCW(self):
        self.switch_window.emit("SCW")

    @pyqtSlot()
    def createSTW(self):
        self.switch_window.emit("STW")

IronCathWindow.py

class IronCathWindowLay(QMainWindow):
    switch_window = QtCore.pyqtSignal(str)

    # ICW Window
    def __init__(self):
        super(IronCathWindowLay, self).__init__()
        loadUi(ApplicationContext().get_resource('IronCathLayout.ui'), self)

        # Button Handler
        self.HomeButton.clicked.connect(self.goHome)

    @pyqtSlot()
    def goHome(self):
        self.switch_window.emit("HICW")

Вот репозиторий для полного кода: https://github.com/oracl4/Weaver

Я ожидаю, что когда любое открытое окно закрывается, программа закрывается полностью без зависания.

...