调用 setParent 时 QMenu 显示不正确

Posted

技术标签:

【中文标题】调用 setParent 时 QMenu 显示不正确【英文标题】:QMenu displays incorrectly when setParent called 【发布时间】:2016-10-12 13:35:50 【问题描述】:

我想创建一个函数来构建一个可以动态添加到窗口菜单栏的上下文菜单。考虑以下添加简单 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_()

这按预期工作。请注意,需要设置 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_()

【问题讨论】:

【参考方案1】:

您调用setParent 的方式会重置窗口标志,因此请改为:

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

【讨论】:

效果很好。我不知道有一个重载的setParent 函数

以上是关于调用 setParent 时 QMenu 显示不正确的主要内容,如果未能解决你的问题,请参考以下文章

关于WinForm 中 调用SetParent这个API的问题

当我以 root 身份运行 PyQt 应用程序时,为啥我的 QMenu 中不显示 QIcons?

5.1 Qmenu菜单栏

setParent 的 PyQt5 行为以显示没有布局的 QWidget

显示 QMenu 以响应 QLabel 中的右键单击,可能吗?

指定 QMenu 的左上角位置