Анализ и изменение таблицы стилей 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
.