Russian Qt Forum
Ноябрь 24, 2024, 14:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение цвета элементов пользовательского составного виджета  (Прочитано 6644 раз)
strilya
Гость
« : Август 28, 2015, 23:25 »

Доброго времени суток.
Имеется составной виджет, примерно следующей структуры:



Его элементы - различные виджеты, являющиеся, разумеется, дочерними 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, но, как-то, мне не сильно нравится эта перспектива. Я, все-таки, не векторный графический редактор пишу.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Август 30, 2015, 01:04 »

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #2 : Август 30, 2015, 12:03 »

+1 за QSS. Не вижу проблем.
Записан
strilya
Гость
« Ответ #3 : Август 30, 2015, 13:48 »

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

А вы думаете у стиля есть такие возможности? Вам придется сделать то же самое, что вы описали для QSS.

PS вам проще свой виджет написать со своим блекджеком и ... цветом.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 30, 2015, 14:06 »

Хотя это ну через чур, имхо.
"чересчур"  Улыбающийся

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

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Август 30, 2015, 21:40 »

Я за QML
Записан

ArchLinux x86_64 / Win10 64 bit
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Август 31, 2015, 16:37 »

Цитировать
Каким образом анимировать, цвет? Писать свой класс, передавать в него duration и указатель на объект, в нем вручную пересчитывать время, цвета, и применять их к QSS?

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
strilya
Гость
« Ответ #8 : Сентябрь 01, 2015, 00:00 »

Добавьте какую-нибудь цветовую пропердь и спокойно ее анимируйте. А по сигналу изменения этой проперди уже выполняйте реальное изменение цвета (SVN или qss или как)

Так и сделал.

Спасибо всем за ответы и помощь
« Последнее редактирование: Сентябрь 01, 2015, 08:44 от strilya » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.105 секунд. Запросов: 22.