首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改QMenuBar上特定项(QMenuBar类型)的突出显示颜色

更改QMenuBar上特定项(QMenuBar类型)的突出显示颜色
EN

Stack Overflow用户
提问于 2022-05-20 09:13:38
回答 1查看 83关注 0票数 0

我想模仿的行为窗口,右上角的行动时,悬停在最小化-最大化-关闭按钮。

因此,我创建了一个包含3 QMenuBar的QActions。

代码语言:javascript
复制
class WindowMenuActions(QMenuBar):

    def __init__(self):
        super(WindowMenuActions, self).__init__()
        minimize_action = QAction(self)
        minimize_action.setIcon(_MINIMIZE_ICON)

        maximize_action = QAction(self)
        maximize_action.setIcon(_MAXIMIZE_ICON)

        exit_action = QAction(self)
        exit_action.setIcon(_CLOSE_ICON)
        
        self.addAction(minimize_action)
        self.addAction(maximize_action)
        self.addAction(exit_action)

并在使用样式表悬停时设置背景色(适用于整个QApplication):

我希望关闭按钮具有不同的高亮显示颜色,因此我尝试在exit_action上设置一个布尔属性,以更改该特定项的颜色,但它没有任何效果(实际上,如果我在样式表中添加该属性,它甚至不考虑样式表值)。

你知道怎么做到这一点吗?为了扩展这个问题,我不仅要将其用于最小化-最大化-关闭操作,而且还要理解如何在QActions上应用不同的悬停/选定颜色(而不是在QMenuBar中的QMenu中,我已经找到了解决方案)。

这是一个正在运行的示例:

代码语言:javascript
复制
from PySide2.QtWidgets import QMenuBar, QAction, QStyle, QApplication, QMainWindow
from PySide2.QtCore import Qt


class WindowMenuActions(QMenuBar):

    def __init__(self):
        super(WindowMenuActions, self).__init__()
        minimize_action = QAction(self)

        _MINIMIZE_ICON = self.style().standardIcon(QStyle.SP_TitleBarMinButton)
        _MAXIMIZE_ICON = self.style().standardIcon(QStyle.SP_TitleBarMaxButton)
        _EXIT_ICON = self.style().standardIcon(QStyle.SP_TitleBarCloseButton)

        minimize_action.setIcon(_MINIMIZE_ICON)
        minimize_action.setProperty('exit_action', False)

        maximize_action = QAction(self)
        maximize_action.setProperty('exit_action', False)
        maximize_action.setIcon(_MAXIMIZE_ICON)

        exit_action = QAction(self)
        exit_action.setProperty('exit_action', True)
        exit_action.setIcon(_EXIT_ICON)

        self.addAction(minimize_action)
        self.addAction(maximize_action)
        self.addAction(exit_action)
        self.setStyleSheet(
            'QMenuBar::item:selected {'
                'background-color: grey;'
            '}'
            'QMenuBar::item[exit_action=true]:selected {'
                ' background-color: red;'
            '}')


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    main = QMainWindow()
    main.setMenuBar(WindowMenuActions())
    main.show()
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

发布于 2022-05-20 09:49:18

对任何感兴趣的人来说,我的排序方法是继承常规QWidget而不是QMenuBar,使用QToolButton而不是QAction。

工作实例:

代码语言:javascript
复制
from PySide2.QtWidgets import QMenuBar, QStyle, QApplication, QMainWindow, QWidget, QHBoxLayout, QToolButton, QMenu
from PySide2.QtCore import Qt

class MenuBar(QMenuBar):

    def __init__(self):
        super(MenuBar, self).__init__()

        self.addMenu(QMenu('File'))
        self.addMenu(QMenu('Help'))
        self.setCornerWidget(WindowMenuActions(self))


class WindowMenuActions(QWidget):

    def __init__(self, parent=None):
        super(WindowMenuActions, self).__init__(parent)

        _MINIMIZE_ICON = self.style().standardIcon(QStyle.SP_TitleBarMinButton)
        _MAXIMIZE_ICON = self.style().standardIcon(QStyle.SP_TitleBarMaxButton)
        _EXIT_ICON = self.style().standardIcon(QStyle.SP_TitleBarCloseButton)

        minimize = QToolButton(self)
        minimize.setIcon(_MINIMIZE_ICON)

        maximize = QToolButton(self)
        maximize.setIcon(_MAXIMIZE_ICON)

        exit_action = QToolButton(self)
        exit_action.setProperty('exit_button', True)
        exit_action.setIcon(_EXIT_ICON)

        layout = QHBoxLayout()
        layout.addWidget(minimize)
        layout.addWidget(maximize)
        layout.addWidget(exit_action)
        self.setLayout(layout)

        self.setStyleSheet(
            'QToolButton:hover {'
                ' background: grey;'
            '}'
            'QToolButton[exit_button=true]:hover {'
            ' background: red;'
            '}'
        )


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    main = QMainWindow()
    main.setWindowFlags(Qt.FramelessWindowHint)

    main.setMenuBar(MenuBar())
    main.show()
    sys.exit(app.exec_())

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72316405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档