Название: Изменение цвета элементов пользовательского составного виджета Отправлено: 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 или как) Так и сделал. Спасибо всем за ответы и помощь |