主程序工作不错,但是当把它放到一个函数中时,pyQt不起作用

时间:2013-09-02 00:35:44

标签: python qt qt4 pyqt4

我在mainWindow中有FramePyQt,在我的main程序中我有以下代码:

app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
Frame = QtGui.QFrame()
ui = Ui_Frame()
ui.setupUi(Frame)
Frame.show()    
sys.exit(app.exec_())

上面的代码,显示主窗口和框架,

我为我的程序创建了一个类:

class ShowHide(object):
    def __init__(self):
        pass

    def showFrameMaterials(self):
        Frame = QtGui.QFrame()
        ui = Ui_Frame()
        ui.setupUi(Frame)
        Frame.show()
        print "it's debugging"

    def showMainWindow(self):
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()

这导致我有两个函数,我称之为showMainWindow()showFrameMaterials()然后我更改了我的主要内容,如:

obj = ShowHide()
obj.showMainWindow()
obj.showFrameMaterials()
sys.exit(app.exec_())

但是我没有看到任何窗口,我回到代码并将mainwindow的代码放入主程序并调用showFrameMaterials(),例如:

    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    obj = ShowHide()
    obj.showMainWindow()
    obj.showFrameMaterials()
    sys.exit(app.exec_())

但我只看到MainWindow ......

问题: 我的问题在哪里?

1 个答案:

答案 0 :(得分:1)

您没有在基于类的版本中看到任何窗口,因为该函数调用finalize并且您的PyQt对象正在被垃圾收集。在简单的第一种情况下,包含PyQt对象的变量在持续时间内保持在范围内。

在这个简单的例子中,最简单的方法是将PyQt对象存储在实例变量中,即。 self.Frameself.MainWindow保留对对象的引用,以便Python不会垃圾收集它们。

通常你不会以这种方式使用PyQt。您将相关对象子类化并在初始化器中进行设置。