我想创建一个函数来构建一个上下文菜单,该菜单可以动态添加到窗口的菜单栏中。考虑下面的最小示例,以添加简单的QMenu:

from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        menu = QtWidgets.QMenu('Menu', parent=self)
        act1 = menu.addAction('Action 1')
        act2 = menu.addAction('Action 2')
        self.menuBar().addMenu(menu)

app = QtWidgets.QApplication([])
window = MainWindow()
window.show()
app.exec_()


python - 调用setParent时QMenu显示不正确-LMLPHP

这按预期工作。请注意,需要设置QMenu的父项才能显示。



现在,如果我将菜单代码分解为自己的功能,并显式设置父代码,则会得到以下信息。这里发生了什么?

from PyQt5 import QtWidgets

def createMenu():
    menu = QtWidgets.QMenu('Menu')
    act1 = menu.addAction('Action 1')
    act2 = menu.addAction('Action 2')
    return menu

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        menu = createMenu()
        menu.setParent(self)
        self.menuBar().addMenu(menu)

app = QtWidgets.QApplication([])
window = MainWindow()
window.show()
app.exec_()


python - 调用setParent时QMenu显示不正确-LMLPHP

最佳答案

调用setParent的方式会重置窗口标志,因此请执行以下操作:

    menu.setParent(self, menu.windowFlags())

关于python - 调用setParent时QMenu显示不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40000081/

10-09 19:52