Здравствуйте, уважаемые Хабрчане и гости!
Так как моя первая статья была опубликована и получила хоть какой-то положительный отклик, решил сделать еще одну статью, которую давно хотел написать.
В данной статье пойдет речь о стилях в Qt, конкретно я буду использовать для примера PySide6.
Опять же, статья не претендует на звание супер-туториала, а скорее носит характер некого «небольшого справочника» или «мини-гайда» для тех, кто хочет приукрасить свое приложение на Qt. Тем более я не pro в CSS, и делаю на пробу, эксперементрую.
В качестве примера возьму несколько виджетов, и постараюсь схематично наглядно показать, как некоторые строки из QSS (CSS для Qt) могут преобразить виджет.
В документации по Qt приводятся некоторые примеры, но я решил немного прочитать и в других источниках, и сделать наглядный пример.
Есть несколько способов, как можно применить стили к своему приложению (которые я знаю):
В самом QtDesigner
![Контекстное меню для вызова редактора QSS Контекстное меню для вызова редактора QSS](https://habrastorage.org/getpro/habr/upload_files/c75/bbb/b0e/c75bbbb0e7622711656909dec61a59bf.png)
![Редактор QSS Редактор QSS](https://habrastorage.org/getpro/habr/upload_files/7a5/50f/fef/7a550ffef8471cb024a0ecd9965181c0.png)
В коде приложения, вызвав соответствующие методы у объекта виджета (setStyleSheet).
self.ui.export_notes_button.setStyleSheet('''
QPushButton {
border: 3px;
border-color: blue;
}
''')
Либо написав все в файл с расширением *.qss и потом добавить его в ресурсы *.qrc и конвертировать в файл (в моем случае на PySide6), чтобы можно было обращаться к нему в коде.
![Файл со стилем QSS Файл со стилем QSS](https://habrastorage.org/getpro/habr/upload_files/c8b/39b/865/c8b39b8655c2a259c13c7c479a436308.png)
На скриншоте выше, у меня находится код для одного из стилей к моему приложений.
![Список файлов со стилями QSS Список файлов со стилями QSS](https://habrastorage.org/getpro/habr/upload_files/154/4c6/606/1544c6606557d0706e19de703f4eafa2.png)
На данном скриншоте показан список файлов со стилями QSS, которые пользователь моей программы может менять в настройках приложения.
Данные файлы необходимо указать в файле ресурсов:
<RCC>
<qresource>
<file>style/kilimanjaro.qss</file>
<file>style/morningstar.qss</file>
<file>style/default)white.qss</file>
</qresource>
</RCC>
Затем, нам нужно конвертировать файл ресурсов в понятный для Python формат:
pyside6-rcc styles.qrc -o styles_rc.py
В итоге у нас получилось следующее:
![Файлы ресурсов Файлы ресурсов](https://habrastorage.org/getpro/habr/upload_files/e54/782/d1b/e54782d1bfeb408ab78cf79d04ea2a29.png)
Далее, можно обратиться к ресурсам через импорт файла:
from Notessa.resource import styles_rc
И установить стиль:
if not settings.value('StylePath'):
style_file = QFile(':/styles/kilimanjaro.qss')
else:
style_file = QFile(settings.value('StylePath'))
style_file.open(QFile.OpenModeFlag.ReadOnly)
convert = style_file.readAll().toStdString()
app.setStyleSheet(convert)
Стоить пояснить, что в своем примере из нескольких стилей у меня в коде используется один по умолчанию. Выбранный стиль открывается как файл, с него считываются все строки, преобразуются в строковый формат и затем устанавливаются.
Более подробно пример моего приложения, над которым с перерывами работаю несколько лет, можно изучить по ссылке
Ссылка на релиз моего проекта, откуда взят пример
![Итоговый вид приложения Итоговый вид приложения](https://habrastorage.org/getpro/habr/upload_files/5c7/f7d/d78/5c7f7dd787c6ffbc9e05cad6fadfc895.png)
Немного по составляющим стилей виджетов
В качестве примера для разбора будут представлены QComboBox, QScrollBar и QSpinBox.
Начнем с QComboBox. Для QComboBox можно задавать стили в зависимости от его состояния.
![QComboBox краткий разбор составляющих по стилям QComboBox краткий разбор составляющих по стилям](https://habrastorage.org/getpro/habr/upload_files/9d9/4f7/437/9d94f743749b0b8ec4168197bc823f47.png)
QScrollBar.
![Основные значения для вертикального QScrollBar Основные значения для вертикального QScrollBar](https://habrastorage.org/getpro/habr/upload_files/fd6/607/d27/fd6607d2724d3009e6124accbd61e50c.png)
![Составляющие QScrollBar Составляющие QScrollBar](https://habrastorage.org/getpro/habr/upload_files/596/2ca/d9e/5962cad9e3c7f6f1e709259466889f07.png)
![Стили для ползунка QScrollBar Стили для ползунка QScrollBar](https://habrastorage.org/getpro/habr/upload_files/896/815/04c/89681504ce10d2e49ad51dbd79c080cf.png)
И под конец, в качестве примера возьмем QSpinBox.
![Краткий разбор QSpinBox Краткий разбор QSpinBox](https://habrastorage.org/getpro/habr/upload_files/0fe/102/a07/0fe102a074f8c7ba8e41e28fea60119b.png)
У QSpinBox можно поменять расположение кнопок (вместо стандартного размещения справа). Например, сделать их по разные стороны. Так же, для них можно задать картинки (стрелочки, значок минуса/плюса и т.д):
QDoubleSpinBox::up-arrow {
image: url(:/icons/forward.png)
}
QDoubleSpinBox::down-arrow {
image: url(:/icons/back.png)
}
(данный код опять же взят из моего приложения, ссылку на релиз которого я указал выше).
Статья подошла к концу. Хочется порекомендовать, что не бойтесь экспериментировать, как это делал я в QtDesigner, где сразу можно увидеть результат. Еще больше примеров виджетов можно посмотреть в документации (и при желании сделать для себя шпаргалку, как сделал я)
Источник информации от Qt
https://doc.qt.io/qt-6/stylesheet-examples.html
Спасибо за внимание!
Sazonov
Попробуйте стилизованные контролы в QML и вы забудете виджеты и qss (qt style sheet) как страшный сон.
Qss это сильно кастрированный css3, к тому же без анимаций, тормознутый и очень ограниченный даже при использовании с виджетами.