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)
我在整个 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)