Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用setParent时,QMenu显示不正确_Python_Qt_Pyqt_Qmenu_Qmenubar - Fatal编程技术网

Python 调用setParent时,QMenu显示不正确

Python 调用setParent时,QMenu显示不正确,python,qt,pyqt,qmenu,qmenubar,Python,Qt,Pyqt,Qmenu,Qmenubar,我想创建一个函数来构建可以动态添加到窗口菜单栏的上下文菜单。考虑以下添加简单QMenu的最小示例: from PyQt5 import QtWidgets class MainWindow(QtWidgets.QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) menu = QtWidgets.QMenu(

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

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

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

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

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

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