Как стать автором
Обновить

Мой рецепт работы с CSS-стилями в Qt

Время на прочтение2 мин
Количество просмотров5K
Вопрос
Как в Qt свободно назначать различные стили однотипным (например QPushButton) компонентам, если я хочу все стили держать в одном css файле?

Да, и желательно уметь это делать из QtDesigner (мы же не злобные самоистязатели, все любят сахар)

Немного предыстории вопроса или Бла-бла-бла
Так получилось, что большая часть кода в моей жизни пришлась на GUI. Писался этот код в разное время на разных языках и платформах. В итоге, сейчас я делаю ЭТО на Qt. А до Qt делал то же самое на Flex (Adobe Flex). А до этого был WinForms, MFC, VCL и т.д. А рассказываю я все это, собственно, с целью:

1) постулировать, что из всего перечисленного самым удобным UI-development инструментом оказался Flex.
ИМХО: WPF и последние версии Qt это подтверждают, так как перенимают всё хорошее от Flex

2) подвести к сути проблемы с которой я столкнулся.
Во Flex был довольно удобный инструмент для скинирования: CSS.

Пример использования во Flex: в нашем интерфейсе мы хотим использовать зелёные, красные и синие кнопки. Мы создаем в CSS файле три стиля: greenButton, redButton и blueButton. А дальше просто лазаем по нашим формочкам и выставляем у кнопаньки, которую хотим сделать зеленой, свойство styleName=«greenButton» (ну и для других цветов соответственно).

Теперь перемещаемся в Qt. Здесь тоже есть механизм CSS и более того, здесь он намного более функциональный. НО. Встает вопрос. см. Вопрос

Поиск решения
Смотрим на описание Qt-шных css. Там есть такое важное понятие как селектор. Это собственно и есть некое условие, исходя из которого стиль применяется или нет к объекту. Итак, какие бывают селекторы:

1) по типу. т.е. ко всем контролам данного типа применяется стиль (например ко всем объектам типа QPushButton)
Нифига мне это не подходит. У меня все кнопки имеют тип QPushButton, но какие-то из них я хочу сделать одного стиля, а какие-то другого.

Тут надо сделать одно признание. Мне стыдно об этом говорить. Честно. Но до последнего момента я занимался тем, что создавал классы наследники QPushButton с одной единственной целью — применять данный селектор. Т.е. я создавал класс GreenButton: public QPushButton, RedButton :public QButton и т.д. А потом просто в QTDesigner промоутил QPushButton к одному из моих классов в зависимости от того какой стиль я хочу наложить на него. Вот. Не бейте ногами.

2) по имени. Не катит ни разу.

3) по значению какого-либо свойства.
Вот оно. Это бы подошло. Подошло бы, если бы у QWidget было свойство типа tag, куда можно было бы писать что угодно не воздействуя на остальной функционал.

А теперь мой ответ.

Мой ответ
Совсем недавно я вдруг обнаружил в QtDesigner зелененький крестик. Нет, он там был всегда, просто я его упорно игнорировал. Оказалось этот крестик добавляет динамической свойство к объекту. Ну вот собственно и весь ответ:)

Т.е. в нашем примере мы просто добавляем для кнопок (к которым хотим применить greenButtonStyle) своство greenButton = true [через QtDesigner или setProperty(«greenButton », QVariant(true));]
А в CSS пишем:

QPushButton[greenButton="true"]<br>
{<br>
greenButtonStyle content;<br>
}<br>
<br>
QPushButton[redButton="true"]<br>
{<br>
redButtonStyle content;<br>
}<br>
<br>
and so on<br>


Вот такое вот извращение.

Может быть кто-то знает решение лучше?

Знаешь как лучше? Расскажи
Теги:
Хабы:
Всего голосов 7: ↑7 и ↓0+7
Комментарии1

Публикации

Истории

Ближайшие события

19 марта – 28 апреля
Экспедиция «Рэйдикс»
Нижний НовгородЕкатеринбургНовосибирскВладивостокИжевскКазаньТюменьУфаИркутскЧелябинскСамараХабаровскКрасноярскОмск
24 апреля
VK Go Meetup 2025
Санкт-ПетербургОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
14 мая
LinkMeetup
Москва
5 июня
Конференция TechRec AI&HR 2025
МоскваОнлайн
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область