Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: strilya от Август 28, 2015, 23:25



Название: Изменение цвета элементов пользовательского составного виджета
Отправлено: strilya от Август 28, 2015, 23:25
Доброго времени суток.
Имеется составной виджет, примерно следующей структуры:

(http://s7.hostingkartinok.com/uploads/images/2015/08/02227af9d72845e664efc6d00215aaa4.png)

Его элементы - различные виджеты, являющиеся, разумеется, дочерними QWidget, как и стандартные, так и пользовательские.
Суть проблемы в следующем. Необходимо для каждого из элементов установить какой-либо цвет, причем, чтобы к данному цвету был прямой доступ для его быстрой и простой замены, либо, анимации смены этого цвета. В общем, QSS не предлагать. Также, хочу сказать, что некоторыми элементами является QSvgWidget. Т.е, svg изображение. Цвет которого также необходимо, менять.

Пробовал реализовывать чз QGraphicsColorizeEffect и QPalette. В каждом из этих способов есть ряд недостатков, не позволяющие полностью решить задуманное.
QPalette: Так и не разобрался, как через него закрасить QSvgWidget. В документации не нашел, какие именно группы палитры отвечают за SvgWidget. QPalette::Background, при autofillbackground(true) определяет цвет для фона svg, а не самого svg. QPalette::Base не работает вовсе.
QGraphicsColorizeEffect: Решает проблему QPalette, и является очень замечательным средством таки, но опять же, с недостатком, которым является наследование. Т.е., если чз QGraphicsColorizeEffect задать элементу 2 какой-то цвет, то задавать цвет элементам 4 и 5 будет бессмысленно, ибо они будут лежать в слое элемента 2. Если отказаться от слоев, то также срабатывает не всегда. Но если отказываться от слоев, тогда нужно использовать либо точное позиционирование объектов, что будет вынуждать писать тонну кода в переопределенном resizeEvent, либо позиционирование на коэффицентах, что опять же, чуть меньше кода в resizeEvent, но больше самих операций по вычислениям координат вложенных виджетов. В общем, не сильно хотелось бы.
Можно, было бы, применять к некоторым элементам QPalette, а к некоторым QGraphicsColorizeEffect, но, например, элемент №2 - это, в любом случае, SVG. Т.е. к нему QGraphicsColorizeEffect необходим. А это не позволит задать цвет для элементов 4,5.
Можно, конечно, извратиться по полной, редактировать на-лету svg, но, как-то, мне не сильно нравится эта перспектива. Я, все-таки, не векторный графический редактор пишу.


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: Racheengel от Август 30, 2015, 01:04
Цитировать
Необходимо для каждого из элементов установить какой-либо цвет, причем, чтобы к данному цвету был прямой доступ для его быстрой и простой замены, либо, анимации смены этого цвета. В общем, QSS не предлагать.

Противоречивое утверждение... Как раз через стили это проще всего и сделать, при условии, если виджеты их корректно поддерживают...


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: vipet от Август 30, 2015, 12:03
+1 за QSS. Не вижу проблем.


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: strilya от Август 30, 2015, 13:48
Спасибо за ответы.
Виджеты, разумеется, корректно их (стили) поддерживают. Хорошо, можно даже быстро заменить цвет с одного на другой, да. Благо методы QString это позволяют. Но вот, допустим, нужно впилить анимацию этого самого цвета. Цвета заливки самого виджета. В QSS нет той CSS3 анимации. Отсюда использовать либо QPropertyAnimation (а для него нужен прямой доступ к property какого-либо класса, коими являлись QGraphicsColorizeEffect или QPalette, имея property color), либо QStateMachine. Хотя это ну через чур, имхо.
Каким образом анимировать, цвет? Писать свой класс, передавать в него duration и указатель на объект, в нем вручную пересчитывать время, цвета, и применять их к QSS? Ну ребят, ну через чур же.


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: Bepec от Август 30, 2015, 13:52
А вы думаете у стиля есть такие возможности? Вам придется сделать то же самое, что вы описали для QSS.

PS вам проще свой виджет написать со своим блекджеком и ... цветом.


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: Igors от Август 30, 2015, 14:06
Хотя это ну через чур, имхо.
"чересчур"  :)

Каким образом анимировать, цвет? Писать свой класс, передавать в него duration и указатель на объект, в нем вручную пересчитывать время, цвета, и применять их к QSS? Ну ребят, ну через чур же.
Добавьте какую-нибудь цветовую пропердь и спокойно ее анимируйте. А по сигналу изменения этой проперди уже выполняйте реальное изменение цвета (SVN или qss или как)


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: kuzulis от Август 30, 2015, 21:40
Я за QML


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: Racheengel от Август 31, 2015, 16:37
Цитировать
Каким образом анимировать, цвет? Писать свой класс, передавать в него duration и указатель на объект, в нем вручную пересчитывать время, цвета, и применять их к QSS?

Ну да, типа того. Мы как раз так и делали нечто подобное.


Название: Re: Изменение цвета элементов пользовательского составного виджета
Отправлено: strilya от Сентябрь 01, 2015, 00:00
Добавьте какую-нибудь цветовую пропердь и спокойно ее анимируйте. А по сигналу изменения этой проперди уже выполняйте реальное изменение цвета (SVN или qss или как)

Так и сделал.

Спасибо всем за ответы и помощь