Pyqt - установка цвета фона отдельных объектов QMenu/QAction

Мне нужно сделать QMenu, который содержит QMenus / QActions, произвольно вложенные в него, и каждому подменю / действию должны быть назначены цвета

PyQt позволяет легко создавать меню внутри меню, но проблема в том, что в QMenu нет таблиц стилей или палитры, у меня возникают проблемы с окраской отдельных элементов QMenu по-разному.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# IMPORT STANDARD LIBRARIES
import textwrap
import sys

# IMPORT THIRD-PARTY LIBRARIES
from PySide2 import QtWidgets


class Window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent=parent)
        self.setLayout(QtWidgets.QVBoxLayout())
        self.resize(700, 500)

    def mousePressEvent(self, event):
        '''Whenever the user clicks an item in the list, show its dependencies.'''
        super(Window, self).mousePressEvent(event)

        menu = QtWidgets.QMenu(self)
        submenu1 = menu.addMenu('Test')
        submenu3 = submenu1.addMenu('sub menu with no style')

        submenu1.addMenu('Inner menu with no items or style')

        inner_menu2 = submenu1.addMenu('Inner menu with style')
        inner_menu2.setProperty('test', 'in')

        another_inner_part1 = inner_menu2.addAction('inner inner part with style')
        another_inner_part1.setProperty('test', 'out')
        another_inner_part2 = inner_menu2.addAction('inner inner part with other style')
        another_inner_part2.setProperty('test', 'other')

        submenu3.setProperty('test', 'out')

        submenu4 = submenu1.addMenu('Sub')
        submenu4.setProperty('test', 'out')

        submenu1.setProperty('test', 'out')
        submenu2 = menu.addMenu('Test2')
        submenu2.setProperty('test', 'in')

        position = event.pos()
        menu.exec_(self.mapToGlobal(position))


def main():
    '''The main execution of the current script.'''
    app = QtWidgets.QApplication([])
    window = Window()
    window.setStyleSheet(textwrap.dedent(
        '''
        QWidget[test=out] {
            background-color: red;
        }

        QWidget[test=in] {
            background-color: green;
        }

        QWidget[test=out] {
            background-color: yellow;
        }
        '''
    ))
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Вот что я получил:

введите описание изображения здесь

Я надеялся, что это произойдет (но это не сработало).

введите описание изображения здесь

QWidgetAction обычно является лучшим маршрутом для раскрашивания элементов в QMenu, но, насколько я знаю, вы не можете вкладывать подменю в QWidgetAction, не разбираясь с проблемой. Но я пойду по этому пути, если нет лучшего пути.

Если кто-нибудь знает простое решение, пожалуйста, поделитесь.

0 ответов

Другие вопросы по тегам