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

QMenu not inheriting stylesheet when not created via addMenu

我在整个 window 上设置了一个样式表,其中 QMenu 的背景应该是绿色的。但是,当我创建菜单时(self.project_menu in MenuBar class),它并没有继承样式表。如果我改用 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_())

解释:

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

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

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

相反,如果您使用:

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

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

解决方案:

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

self.project_menu = QtWidgets.QMenu("Project", <b>self</b>)
self.addMenu(self.project_menu)