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 创建时不继承样式表的主要内容,如果未能解决你的问题,请参考以下文章