我使用的是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编程但发现我仍然输了)。
提前感谢您的帮助
答案 0 :(得分:0)
PyQt可能令人困惑,因为有两个对象所有权模型一起使用。例如,您正在创建一个QMenu
,它可以由您的Python程序或Qt对象层次结构拥有。
QMenu
有两个典型的用例:在一个用例中,您可以创建一个弹出菜单并使用QMenu.exec_
来模拟响应。在这种情况下,你自然而然地拥有了#34;菜单:您将保留对它的引用,直到它完成并关闭。
但是你的代码说明了另一种情况。在这里你没有兴趣保持对象的引用:你已经添加了一个作为一种解决方法。但是你不需要这样做。
Qt有自己的对象所有权层次结构,通常从没有父级的顶级窗口开始,然后向下遍历所有组件小部件。通常通过在创建每个子QObject时分配父对象来建立该父对象。完成此操作后,对象的生命周期与其父级的生命周期相关,除非它们被更快地删除。
在这种情况下,这就是你想要的:
menu = QtGui.QMenu("File",self)
其他小部件(例如中央小部件和菜单栏)可能会出现同样的问题。但是在每种情况下,当他们被添加到主窗口时,他们被分配了父母。
给予QObjects父母通常是正确的做法。很快就会成为为每次创建调用添加父参数的第二天性。