2016-10-12 5 views
1

Я хочу создать функцию для создания контекстного меню, которое может динамически добавляться в строку меню окна. Рассмотрим следующий минимальный пример для добавления простого QMenu:QMenu отображается неправильно, когда setParent называется

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_() 

enter image description here

Это работает, как ожидалось. Обратите внимание, что установка родителя для 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_() 

enter image description here

ответ

3

Путь вы звоните setParent сбрасывает флаги окна, так что вместо этого:

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

Работает отлично. Я не знал, что есть перегруженная функция 'setParent' – user3419537