QMenu 未通过 addMenu 创建时不继承样式表

Posted

技术标签:

【中文标题】QMenu 未通过 addMenu 创建时不继承样式表【英文标题】:QMenu not inheriting stylesheet when not created via addMenu 【发布时间】:2020-07-23 00:34:57 【问题描述】:

我在整个窗口中设置了一个样式表,其中QMenu 的背景应该是绿色的。但是,当我创建菜单(MenuBar 类中的self.project_menu)时,它不会继承样式表。如果我改为使用 self.project_menu = self.addMenu("Project") 它工作正常。这样做有什么原因吗?

class MenuBar(QtWidgets.QMenuBar):
    def __init__(self):
        super(MenuBar, self).__init__()
        self.project_menu = QtWidgets.QMenu("Project")
        self.addMenu(self.project_menu)
        self.create_new_action = self.project_menu.addAction("Create New Project")


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.widget = QtWidgets.QWidget()
        self.setCentralWidget(self.widget)
        self.mainLayout = QtWidgets.QVBoxLayout()
        self.widget.setLayout(self.mainLayout)

        self.menu_bar = MenuBar()
        self.setMenuBar(self.menu_bar)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = MainWindow()
    win.setStyleSheet("""
        QMenu
            background: green;
        
    """)
    win.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

说明:

当使用setStyleSheet方法从父母传播到孩子时,在使用的情况下:

self.project_menu = self.addMenu("Project")

QMenu 的父级是 QMenuBar(您可以检查:assert self.project_menu.parent() == self),QMenuBar 是窗口的子级,因此样式表将被传播。

如果你使用:

self.project_menu = QtWidgets.QMenu("Project")
self.addMenu(self.project_menu)

QMenu 没有父级,因此不会传播样式表。

解决方案:

解决方法是将QMenuBar设置为QMenu的父级:

self.project_menu = QtWidgets.QMenu("Project", self)
self.addMenu(self.project_menu)

【讨论】:

以上是关于QMenu 未通过 addMenu 创建时不继承样式表的主要内容,如果未能解决你的问题,请参考以下文章

Qt:删除MainWindow后QMenu似乎没有被删除

笔记:QT的菜单

QT QMianWindow类

QT学习一:菜单

QMenu - 快捷方式未触发

防止 QMenu 在其 QAction 之一未触发时关闭