QMenu отображается неправильно при вызове SetParent

#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('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())
  

Комментарии:

1. Отлично работает. Я не знал, что существует перегруженная setParent функция