#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
функция