Вопрос
Как в 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 пишем:
Вот такое вот извращение.
Может быть кто-то знает решение лучше?
Знаешь как лучше? Расскажи
Как в 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>
Вот такое вот извращение.
Может быть кто-то знает решение лучше?
Знаешь как лучше? Расскажи