如何通过整个 MainWIndow 将 CSS 样式应用于 QMenu

How to apply CSS Style to QMenu via an entire MainWIndow

运行 下面的示例代码创建了一个按钮 window。单击按钮会弹出 pull-down 菜单。

当 CSS 'appStyle' 直接应用于 menu 时,它似乎运行良好:

menu.setStyleSheet(appStyle)

但是当相同的CSS 'appStyle'分配给整个window时使用:

view.setStyleSheet(appStyle)

没有任何反应(只需注释掉 menu.setStyleSheet(appStyle) 即可看到)。 如果 CSS 样式表针对整个视图而不是针对每个菜单或每个小部件单独使用一次,那就太好了。如何实现?

bgColor='#1F1F1F'
appStyle="""
QMenu {{  font-size:10pt; selection-background-color: #ffaa00; selection-color: black; background-color: #7A7A7A; border-style: solid; border: 0px solid #EBEBEB; border-radius: 0; color: #EBEBEB; padding: 0px 0px 0px 0px; }}
QMenu:on  {{padding-top: 0px; padding-left: 0px; background-color: #7A7A7A; selection-background-color: #ffaa00; color: #EBEBEB; border-radius: 0;}}
QMenu QAbstractItemView  {{ border: 0px solid black; background-color: #7A7A7A; color: #EBEBEB; border-radius: 0; }}
QMenu:hover {{ border: 0px solid #ffa02f; }}
QMenu::drop-down  {{ border-radius: 0px; background-color: #7A7A7A; color: #EBEBEB; }}""".format(bgColor) 


from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__() 
        button=QToolButton(self)
        button.setText('Click Here')

        menu=QMenu()
        menu.addAction("Action01")
        menu.addAction("Action02")
        menu.addAction("Action03")

        separator=menu.addAction("")
        separator.setSeparator(True)

        subMenu=menu.addMenu('SubMenu')
        subMenu.addAction("SubAction01")
        subMenu.addAction("SubAction02")
        subMenu.addAction("SubAction03")   

        button.setMenu(menu)
        button.setPopupMode(QToolButton.InstantPopup)
        menu.setStyleSheet(appStyle)   


app=QApplication(sys.argv)    
view=Window() 
view.setStyleSheet(appStyle)
view.show()
sys.exit(app.exec_())

QMenu 声明中传递视图 self 的实例。 所以,而不是:

menu=QMenu()

做:

menu=QMenu(self)

现在,当样式表应用于主 window 时,其样式表会向下传播到其子项 - 在本例中为 menubutton 实例。

工作代码如下:

bgColor='#1F1F1F'
appStyle="""
QToolButton {{border: 0px solid #0F0F0F; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #7A7A7A, stop: 1 #0F0F0F); color: #EBEBEB}}
QMenu QAbstractItemView  {{ border: 0px solid black; background-color: #7A7A7A; color: #EBEBEB; border-radius: 0; }}
QMenu {{  font-size:10pt; selection-background-color: #ffaa00; selection-color: black; background-color: #7A7A7A; border-style: solid; border: 0px solid #EBEBEB; border-radius: 0; color: #EBEBEB; padding: 0px 0px 0px 0px; }}
QMenu:on  {{padding-top: 0px; padding-left: 0px; background-color: #7A7A7A; selection-background-color: #ffaa00; color: #EBEBEB; border-radius: 0;}}
QMenu:hover {{ border: 0px solid #ffa02f; }}
QMenu::drop-down  {{ border-radius: 0px; background-color: #7A7A7A; color: #EBEBEB; }}""".format(bgColor) 

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__() 
        button=QToolButton(self)
        button.setText('Click Here')

        menu=QMenu(self)
        menu.addAction("Action01")
        menu.addAction("Action02")
        menu.addAction("Action03")

        separator=menu.addAction("")
        separator.setSeparator(True)

        subMenu=menu.addMenu('SubMenu')
        subMenu.addAction("SubAction01")
        subMenu.addAction("SubAction02")
        subMenu.addAction("SubAction03")   

        button.setMenu(menu)
        button.setPopupMode(QToolButton.InstantPopup)

app=QApplication(sys.argv)
view=Window() 
view.setStyleSheet(appStyle)
view.show()
sys.exit(app.exec_())