首页 > 解决方案 > 如何在现有窗口应用程序发出信号后显示另一个小部件?(两个 gui 都使用 pyuic5 从 ui 转换)

问题描述

在现有窗口中单击按钮后如何显示/加载另一个小部件?.

将 QtDesigner 中的两个 GUI 转换为 python 代码后,我无法从第一个小部件“循环”内启动第二个小部件。如何在另一个类/循环中启动另一个对象(类)?程序滞后,一个新的窗口弹出白色,只有一秒钟,一切都崩溃了,没有给出错误,退出代码:255。到目前为止我的努力如下(见 start 函数中的注释):

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        ...

    def retranslateUi(self, MainWindow):
        ...

    def start(self): # this gets activated by a button

        # here I try to invoke another window app (class) unsuccessfully
        app = QtWidgets.QApplication(sys.argv)
        Form = QtWidgets.QWidget()
        ui = Ui_Form()
        ui.setupUi(Form)
        Form.show()

class Ui_Form(Ui_MainWindow):

    def setupUi(self, Form):
       ...
    def retranslateUi(self, Form):
       ...

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

标签: pythonclasswidgetpyqt5

解决方案


对于初学者,您已经在创建表单的位置运行了一个实例,QApplication因此您应该跳过app = QtWidgets.QApplication(sys.argv).Ui_MainWindow.start

要解决窗口仅出现一瞬间的问题:当您在 中创建小部件时Ui_MainWindow.start,将其创建为局部变量Form。这意味着当Ui_MainWindow.start退出时,Form与所有其他局部变量一起被销毁。要让您的小部件存在于外部Ui_MainWindow.start,您可以将其设为Ui_MainWindow对象的实例变量,即

def start(self): 
    self.Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(self.Form)
    self.Form.show()

我不知道这是否会解决崩溃问题,但它至少应该让您的小部件出现一秒钟以上。


推荐阅读