首页 > 解决方案 > PyQt5 在 menuBar 中自定义 QAction 的样式

问题描述

我发现了非常相似的问题,但没有针对此问题的合理解决方案。我想更改显示在 QMainWindow menuBar 菜单中的 QActions 的样式/外观(例如更改背景颜色)。目的是在再次浏览菜单时突出显示当前选择的操作。

例子:

from PyQt5 import QtWidgets, QtCore

class Window(QtWidgets.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)

        action1 = QtWidgets.QAction("action1", self)
        action2 = QtWidgets.QAction("action2", self)
        action1.triggered.connect(self.print_stuff)
        action2.triggered.connect(self.print_stuff)

        mainMenu = self.menuBar()
        mainMenu.setNativeMenuBar(False)
        fileMenu = mainMenu.addMenu('Menu1')
        fileMenu.addAction(action1)
        fileMenu.addAction(action2)

    def print_stuff(self):
        print('whatever')

def run():
    app = QtWidgets.QApplication([])
    application = Window()

    application.show()
    app.exec_()

run()

可以更改 menuBar 中单个菜单的 StyleSheet,但我无法更改 QActions 的 StyleSheet,因为它们不是小部件。然而,修改背景似乎是可能的,因为 QActions 在用鼠标悬停时会突出显示——就像菜单栏中的菜单一样。有任何想法吗?

标签: pythonpyqtpyqt5python-3.5

解决方案


使用QWidgetAction

from PyQt5 import QtWidgets, QtCore, QtGui

class Window(QtWidgets.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)

        mainMenu = self.menuBar()
        mainMenu.setNativeMenuBar(False)
        fileMenu = mainMenu.addMenu('Menu1')
        action1 = QtWidgets.QAction("action1", self)
        action2 = QtWidgets.QAction("action2", self)

        action3 = QtWidgets.QWidgetAction(fileMenu)
        l = QtWidgets.QLabel("action3")
        l.setStyleSheet("QLabel { background-color : red; padding: 4 4 4 4px;}")
        action3.setDefaultWidget(l)

        fileMenu.addAction(action1)
        fileMenu.addAction(action2)
        fileMenu.addAction(action3)

        action1.triggered.connect(self.print_stuff)
        action2.triggered.connect(self.print_stuff)
        action3.triggered.connect(self.print_stuff)

    def print_stuff(self):
        print('whatever')

def run():
    app = QtWidgets.QApplication([])
    application = Window()

    application.show()
    app.exec_()

run()

结果:

结果


推荐阅读