PyQt4:你在哪里可以制作菜单?

时间:2015-05-22 16:42:42

标签: pyqt4 python-3.4 super qmainwindow

我使用的是Python 3和PyQt4

我试图用菜单栏制作一个简单的主窗口。如果我尝试在MainWindow初始化中设置菜单栏但是如果我在某个外部函数中设置菜单栏,则它不起作用。也就是说,以下内容不起作用:

import sys
from PyQt4 import QtGui

class MyMainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        centralWidget = QtGui.QWidget()
        menubar = QtGui.QMenuBar()
        menu = QtGui.QMenu("File")
        menu.addAction("New")
        menubar.addMenu(menu)
        self.setMenuBar(menubar)
        self.setCentralWidget(centralWidget)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mainWindow = MyMainWindow()
    mainWindow.show()
    sys.exit(app.exec_())    

如果我只是将菜单设置向下移动到主程序:

class MyMainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mainWindow = MyMainWindow()

    centralWidget = QtGui.QWidget()
    menubar = QtGui.QMenuBar()
    menu = QtGui.QMenu("File")
    menu.addAction("New")
    menubar.addMenu(menu)
    mainWindow.setMenuBar(menubar)
    mainWindow.setCentralWidget(centralWidget)

    mainWindow.show()
    sys.exit(app.exec_()) 

然后菜单被创建(我知道我没有连接任何动作,这被剥离以显示奇怪性)。我认为这可能与在 init 中有关,但是将其移到另一个类例程,例如setup(self),然后在创建mainWindow之后调用它并没有解决问题。

我似乎对PyQt4中有用和无效的东西感到困惑。如果有人能指出我一些好的资源,我也会很感激(我已经读过快速GUI编程但发现我仍然输了)。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

PyQt可能令人困惑,因为有两个对象所有权模型一起使用。例如,您正在创建一个QMenu,它可以由您的Python程序或Qt对象层次结构拥有。

QMenu有两个典型的用例:在一个用例中,您可以创建一个弹出菜单并使用QMenu.exec_来模拟响应。在这种情况下,你自然而然地拥有了#34;菜单:您将保留对它的引用,直到它完成并关闭。

但是你的代码说明了另一种情况。在这里你没有兴趣保持对象的引用:你已经添加了一个作为一种解决方法。但是你不需要这样做。

Qt有自己的对象所有权层次结构,通常从没有父级的顶级窗口开始,然后向下遍历所有组件小部件。通常通过在创建每个子QObject时分配父对象来建立该父对象。完成此操作后,对象的生命周期与其父级的生命周期相关,除非它们被更快地删除。

在这种情况下,这就是你想要的:

menu = QtGui.QMenu("File",self)

其他小部件(例如中央小部件和菜单栏)可能会出现同样的问题。但是在每种情况下,当他们被添加到主窗口时,他们被分配了父母。

给予QObjects父母通常是正确的做法。很快就会成为为每次创建调用添加父参数的第二天性。