Использование метода FBS get resource в определениях qss? - PullRequest
1 голос
/ 18 июня 2020

У меня есть отдельная таблица стилей qss, которая содержит определения моих таблиц стилей для всего моего приложения. Мне нужно добавить кнопку закрытия в качестве фонового изображения, так как я не смог найти документацию по использованию встроенных значков.

customTabBar::close-button {
    padding: 0px;
    margin: 0px;
    border-radius: 2px;
    border-color: rgba(0, 0, 0, 50%);
    background-image: url(%(closeIcon)s);
    background-position: center center;
    background-repeat: none;
}

from fbs_runtime.application_context.PyQt5 import ApplicationContext

import qstylizer.parser


customIcons = {
    "customTabBar::closeButton.backgroundImage": f"url({app.get_resource('ui/close.png')})",
}

app = ApplicationContext()

with open(app.get_resource("app.qss"), "r") as stylesheet:
    css = qstylizer.parser.parse(stylesheet.read())
    for key, value in customIcons.items():
        property = key.split(".")
        css[property[0]][property[1]].setValue(value)
    app.app.setStyleSheet(css.toString())

файлы хранятся в структуре fbs по умолчанию в src / main / resource / base /ui/*.png

, поскольку я не могу использовать fstrings с фигурными скобками, являющимися частью qt. И этот ответ с использованием форматирования строки python, но я продолжаю получать ключевые ошибки из-за того, что у меня есть некоторые значения цвета rgba, в которых также есть%.

Так как я не могу использовать% age или фигурные скобки, я думал о создании qproperty из get_resource, но не знаю, как это сделать. Мне нужен кросс-совместимый qss, и я не могу избежать фигурных скобок.

Моя основная проблема в том, что изображение не будет доступно, когда я упаковываю приложение с fbs, используя FBS freeze

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Анализ и изменение таблицы стилей Qt с использованием инструментов форматирования python может быть сложным, например, в вашем случае вы пытаетесь отформатировать (0, 0, 0, 50%), вызывая ошибки, поэтому я рекомендую использовать qstylizer (python -m pip install qstylizer), поэтому вы можете легко изменить свойства:

QTabBar::close-button {
    padding: 0px;
    margin: 0px;
    border-radius: 2px;
    border-color: rgba(0, 0, 0, 50%);
    background-position: center center;
    background-repeat: none;
}
import functools

from fbs_runtime.application_context.PyQt5 import ApplicationContext

import qstylizer.parser


customIcons = {
    "QTabBar.closeButton.backgroundImage": f"url({app.get_resource('ui/close.png')})",
}

app = ApplicationContext()

with open(app.get_resource("app.qss"), "r") as stylesheet:
    css = qstylizer.parser.parse(stylesheet.read())
    for key, value in customIcons.items():
        obj = functools.reduce(getattr, key.split("."), css)
        obj.setValue(value)
    app.app.setStyleSheet(css.toString())

Обновление:

Анализ исходного кода :

if key and key[0] not in ["Q", "#", "[", " "] and not <b>key.istitle()</b>:
    key = inflection.underscore(key)

кажется, что это классы TitleCase , поэтому возможное решение - изменить имя класса на Customtabbar:

Customtabbar::close-button {
    padding: 0px;
    margin: 0px;
    border-radius: 2px;
    border-color: rgba(0, 0, 0, 50%);
    background-position: center center;
    background-repeat: none;
}
app = ApplicationContext()

customIcons = {
    "Customtabbar::close-button": {
        "background-image": f"url({app.get_resource('ui/close.png')})"
    },
}

with open(app.get_resource("app.qss"), "r") as stylesheet:
    css = qstylizer.parser.parse(stylesheet.read())
    for qcls, value in customIcons.items():
        for prop, v in value.items():
            css[qcls][prop] = v
    app.app.setStyleSheet(css.toString())

Согласно PEP имена классов должны быть CapWords, поэтому я создал вилку, изменив:

qstylizer / style.py

if key and key[0] not in ["Q", "#", "[", " "] and not key.istitle():

by

if key and key[0] not in ["Q", "#", "[", " "] and key != inflection.camelize(key):

Теперь примите имена классов, которые соответствуют PEP8.

CustomTabBar::close-button {
    padding: 0px;
    margin: 0px;
    border-radius: 2px;
    border-color: rgba(0, 0, 0, 50%);
    background-position: center center;
    background-repeat: none;
}
app = ApplicationContext()

customIcons = {
    "CustomTabBar::close-button": {
        "background-image": f"url({app.get_resource('ui/close.png')})"
    },
}

with open(app.get_resource("app.qss"), "r") as stylesheet:
    css = qstylizer.parser.parse(stylesheet.read())
    for qcls, value in customIcons.items():
        for prop, v in value.items():
            css[qcls][prop] = v
    app.app.setStyleSheet(css.toString())

Update2:

The PR было принято, поэтому необходимо только обновить библиотеку: python -m pip install qstylizer --upgrade.

0 голосов
/ 07 июля 2020

Согласно предложению @ eyllanes c, это было моим решением. файл r cc,

<RCC>
  <qresource>
    <file alias="closeIcon">close.png</file>
  </qresource>
</RCC>

команда оболочки,

pyrcc5 -o resources.py resources.rcc

и вот таблица стилей.

TabBarPlus::close-button {
    background-image: url(:/closeIcon);
    padding: 0px;
    margin: 0px;
    border-radius: 2px;
    background-position: center center;
    background-repeat: none;
}
...