QMenu, созданный в виджете за пределами моего главного окна, не отображается

#python #pyqt #pyqt5 #qmenu

Вопрос:

Я создал QMenu в виджете за пределами моего главного окна, но когда я пытаюсь показать его в своем приложении, он просто не появляется.

Если я создам точно такой же QMenu в своем классе главного окна, он появится без каких-либо проблем.

 from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QWidget,
    QPushButton,
    QMenu,
    QAction
)
from PyQt5 import QtCore


class testWidget(QWidget):
    
    def __init__(self):
        menu = QMenu()
        action = QAction("Test", checkable = True)
        menu.addAction(action)
        menu.addSeparator()
        self.menu = menu
    

class Window(QWidget):
    
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test pricer")
        self.mainLayout = QHBoxLayout()
        self.setLayout(self.mainLayout)
        self.resize(900, 600)
        
        self.button = QPushButton("Show menu")
        self.button.clicked.connect(self.showMenu)
        self.mainLayout.addWidget(self.button)
        
        self.testWidget = testWidget()
        
    
    def showMenu(self):
        print(self.testWidget.menu.actions())
        #self.testWidget.menu.setParent(self)
        self.testWidget.menu.exec_(QtCore.QPoint(200, 200))
        

if __name__ == "__main__":
    app = 0
    app = QApplication([])
    window = Window()
    window.show()
    app.exec_()
 

Я попытался изменить родительское меню на главное окно, но это тоже не решает проблему.

Кто-нибудь знает способ показать меню, все еще создавая его в другом виджете?

Ответ №1:

Отображается QMenu, но не пункт «Тест», поэтому окно очень маленькое. «Тест» не отображается, потому что QAction удаляется, поскольку это локальная переменная, и никакая другая переменная не является владельцем. Есть 2 решения:

  • Передайте родителя в QAction: action = QAction("Test", checkable = True, parent=menu)
  • Сделайте QAction атрибутом класса, изменив action его на self.action .