Название: "Светодиод" из QSvgRenderer и QBrush Отправлено: Гурман от Май 27, 2015, 17:05 Нужен унаследованный от QWidget "светодиод" с изменяемой формой и цветом, причем желательно с возможностью менять цвета плавно. Скачал Qled 0.6.2, посмотрел. Идея тривиальная - грузится шейп в QSvgRenderer и потом рисуется QPainter-ом. Шейпы разные, это нормально. Но для каждого цвета у них отдельный векторный рисунок, то есть никакого плавного переключения, никаких промежуточных цветов, только дискретный выбор из 7-и цветов, жестко заданных в рисунках. Соответственно 6 шейпов на 7 цветов = 48 файлов векторных картинок. И всё это засунуто в ресурсы, то есть, добавить шейпы в динамике никак. Убожество, в общем.
Первая мысль - сделать по-другому, задать по 1-ой векторной картинке на шейп, и все картинки сделать с градациями серого. А рендеринг SVG выполнять с помощью QPainter, у которого QBrush задана требуемым цветом. Соответственно, цвет можно плавно менять. Ожидаемый результат - шейп окрашивается требуемым цветом, с заданными серой картинкой яркостями. С QSvgRenderer практики у меня еще не было, поэтому вопрос к тем, кто с ним работал - это получится именно так? Просьба отвечать только тем, кто имеет опыт работы с QSvgRenderer. Если известно, что это не будет работать, то просьба кинуть идею, как сделать, чтобы работало, но форма и градиенты задавались с помощью векторного рисунка. Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: __Heaven__ от Май 27, 2015, 17:22 Как насчёт отрисовки программным способом? Я себе светодиод представляю как кружок с градиентом. В QWidget::paint написать всё...
Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Гурман от Май 27, 2015, 17:24 Я же просил отвечать по существу вопроса... Не надо уводить в сторону оффтопиками.
Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Гурман от Май 27, 2015, 21:26 Влоб, как хотелось, не работает. Установка цвета кисти не окрашивает картинку. Надо что-то придумывать, типа полупрозрачного цветного слоя или искать способ окрашивать сам SVG.
Никто это не делал? Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Гурман от Май 28, 2015, 17:18 В общем, пока сделал деревянно - пересчетом яркости цветовых компонент, и заменой каждого пиксела в QImage. Если кому понадобится - код рабочий, но выложу кусками, потому что в моём много того, что не имеет отношения к "светодиоду" (в частности, у меня на него текст накладывается).
SVG рисуются любой формы, например в бесплатном Inkscape. Важно создавать "светодиод" черно-белым. Градиенты прекрасно работают. Невидимая часть должна быть сделана прозрачной, с альфа-каналом. Файлы SVG я загрузил в ресурсы, как в Qled, но вкуснее потом сделать загрузку из внешних файлов, чтобы юзеры могли по желанию формы индикаторов менять. Где-то в заголовочном файле класса, который наследует от QWidget (в частности, у меня он наследует от QLabel). Код: QColor color; Где-то в конструкторе должно быть Код: svg = new QSvgRenderer(); Код: svg->load( shapefilename ); // где (QString) shapefilename - имя файла с полным маршрутом в ресурсах Отдельный метод, который надо вызывать каждый раз, когда задан новый шейп, изменен его размер или цвет. Так и эффективнее, и не будет проблемы (http://www.prog.org.ru/topic_28943_0.html) при сборке в minGW. Код: void MyLED::paintLED() И код для paintEvent() этого класса Код: void MyLED::paintEvent(QPaintEvent *) Ну не забыть в деструкторе класса Код: delete image; Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Igors от Май 28, 2015, 17:39 Код: void MyLED::paintLED() Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Гурман от Май 28, 2015, 17:49 Вы бы это почистили, а то молодые засмеют во1ых, что там померещилось не так? во2ых, мне наплевать, в в3их, мне интересны только комментарии, в которых будут предложены другие варианты закраски Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Racheengel от Май 29, 2015, 18:31 наверно, вот это не так:
Цитировать image->setPixel Для подобных манипуляций есть QImage::scanLine(). Кстати - а что плохого в предложении Цитировать Как насчёт отрисовки программным способом? Собственно, я бы в первую очередь на это ориентировался. Или надо, чтобы лэды скины имели? ??? Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Гурман от Май 29, 2015, 21:03 Цитировать image->setPixel Для подобных манипуляций есть QImage::scanLine(). Не принципиально. Раскраска делается только при изменениях. Размеры небольшие, обычно порядка 20х20, 30х30, поэтому разницы не будет совершенно никакой. Даже если будут одновременно 100 светодиодов меняться, что в реальности невероятно, разницу обнаружить не получится. А в paintEvent() рисуется только готовый QImage. надо, чтобы лэды скины имели? ??? да, надо кстати, где-то в 90-х я рисовал "светодиоды" на экране, и вспомнил, что они больше похожи на светодиоды, когда в яркой части они светятся белым, поэтому вот такая модификация тела цикла раскраски: Код: int gray = qBlue(image->pixel(i,j)); Без этого они выглядят, слишком пластиково, и не яркие. Так лучше. Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: kandrey от Май 30, 2015, 01:30 а не получится фильтр с фрагментным шейдером использовать?
Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Гурман от Май 30, 2015, 01:58 а не получится фильтр с фрагментным шейдером использовать? код покажите, и что он даст, чтобы было видно зачем порождать сущности и чтобы работало на любом железе, в т.ч. на любых поддерживаемых видео-картах и во всех поддерживаемых ОС, и желательно в не поддерживаемых ;-) Название: Re: "Светодиод" из QSvgRenderer и QBrush Отправлено: Racheengel от Июнь 01, 2015, 10:56 а не получится фильтр с фрагментным шейдером использовать? ОМГ... Для светодиода то... Можно тогда уже сразу в Unity проект делать начать, чо там... |