在pyqt5中管理窗口的正确方法是什么?

时间:2018-09-11 19:15:19

标签: python pyqt pyqt5 python-3.6 qt-designer

在我正在构建的应用程序中,我有一些正在使用的“窗口”。我试图根据python /行业标准找出如何正确管理它们的方法。我有一个警告屏幕,免责声明屏幕,主gui和本质上是一个用于传达错误的消息框。

我的客户希望使用的程序是显示警告屏幕(QDialog),然后单击按钮时显示免责声明屏幕(QDialog),然后在用户同意免责声明后显示主GUI(QMainWindow)。该消息框仅在需要向用户发出某些事件的警报时使用。 注意:我正在使用qt desinger

我正在尝试以一种非常面向对象的方式来处理这个项目,但是我正在努力以一种并非完全混乱的方式来实现它。我打算做的是有一个主类,该主类在启动时初始化应用程序的所有部分,其中包含两个控制器(一个用于gui,一个用于后端进程)。

到目前为止,我的gui控制器严重失败。最初,我为每个窗口创建一个类,然后尝试在gui控制器中为每个窗口创建对象。我被迫将所有类移动到一个文件中,删除gui控制器类代码,并将此文件用作应用程序的“主要”文件,甚至获得第一个启动窗口。我仍然无法在Windows之间切换,充其量我只能关闭当前打开的窗口。 在Python3 / PyQt5中构建这样的应用程序的正确方法是什么?

某些代码:

#There used to be another class for gui_controller that instantiated all the below (pyqt5 doesn't work this way as I've come to learn)

#Used to be in its own file.
class WarningScreen(QDialog, Ui_SomeWarningScreen):

    def __init__(self, parent=None):
        super(WarningScreen, self).__init__(parent)
        self.setupUi(self)
        self.accept_button_2.clicked.connect(self.acknowledge_warning)

    def acknowledge_warning(self):
        window = Disclaimer()
        window.show()
        self.close()

#Used to be in its own file.
class DisclaimerScreen(QDialog, Ui_UsageDislaimer):

    def __init__(self, parent=None):
        super(DisclaimerScreen, self).__init__(parent)
        self.setupUi(self)

#This was initially in the main class for the application.
if __name__ == "__main__":

    APP = QApplication(sys.argv)

    WINDOW = WarningScreen()

    WINDOW.show()

    sys.exit(APP.exec_())

1 个答案:

答案 0 :(得分:0)

打开的窗口没有一个简单的事实显示,局部变量在其作用域完成时将被删除,在您的情况下,window = Disclaimer()是将被删除的局部变量,因此可能的解决方案是: >

def acknowledge_warning(self):
    self.window = Disclaimer()
    self.window.show()
    self.close()

尽管更好的选择是创建一个实现窗口之间交互逻辑的类或函数,但在下面的部分中,我将显示一个示例:

class WarningScreen(QtWidgets.QDialog, Ui_SomeWarningScreen):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(WarningScreen, self).__init__(parent)
        self.setupUi(self)
        self.accept_button_2.clicked.connect(self.close)
        self.accept_button_2.clicked.connect(self.closed)


class DisclaimerScreen(QtWidgets.QDialog, Ui_UsageDislaimer):
    def __init__(self, parent=None):
        super(DisclaimerScreen, self).__init__(parent)
        self.setupUi(self)


class Controller:
    def __init__(self):
        self.warning = WarningScreen()
        self.disclaimer = DisclaimerScreen()

        self.warning.closed.connect(self.disclaimer.show)
        self.warning.show()

if __name__ == "__main__":
    import sys

    APP = QtWidgets.QApplication(sys.argv)
    w = Controller()
    sys.exit(APP.exec_())