Название: Виджет по форме картинки Отправлено: Aleksey_Zh от Октябрь 06, 2010, 10:22 Раньше, программируя на дельфе делал компоненты произвольной формы. Для их создания была такая функция - setRegion. Пошарив по форуму - в Qt нашел только setMask. Но с помощью него как - то не удается сделать виджет по форме картинки.
void TZhBMPButton::SetRegionByImg() { if (image->isNull()) return ; this->setMask(MaskByImg(*image,TRanspColor)); update(); } QBitmap MaskByImg(QImage Image, QColor clr) { QBitmap *Pix; Pix = new QBitmap; Pix->fromImage(Image,Qt::NoAlpha); QColor CLR = Image.pixel(0,0); Pix->createMaskFromColor(/*clr*/CLR, Qt::MaskOutColor); return *Pix; //режим маскирования MaskInColor, MaskOutColor } В конечном итоге получается либо просто черно-белое изображение на виджете, либо вообще никак. Нужно - сделать виджет по форме картинки. В качестве картинки - использовать бмп-шку и цвет прозрачности. При наведении мыши на фиджет - должно возникать соотв. событие, но только если мышь над закрашеной областью... Что я делаю не так? Название: Re: Виджет по форме картинки Отправлено: Авварон от Октябрь 06, 2010, 10:51 Судя по данному коду - ВСЁ. Кривые названия переменных, передача по значению, утечка в виде new QBitmap;
А по сабжу - маска как раз использует альфа-канал, насколько я знаю, посему для начала стоит убрать Qt::NoAlpha Название: Re: Виджет по форме картинки Отправлено: Aleksey_Zh от Октябрь 06, 2010, 11:13 Судя по данному коду - ВСЁ. Кривые названия переменных, передача по значению, утечка в виде new QBitmap; Если название переменных не нравится - это не значит что они не правильные. Что не правильно по существу?А по сабжу - маска как раз использует альфа-канал, насколько я знаю, посему для начала стоит убрать Qt::NoAlpha P.S. - Qt::NoAlpha убрал - поставил Qt::ColorMode_Mask (точно не уверен, но думаю более уместно) ). Тем не менее ничего так и не изменилось. Если есть (в чем не сомневаюсь, просто нужного не нашел) подобные темы с подобными проблемами - буду благодарен за ссылку Название: Re: Виджет по форме картинки Отправлено: Авварон от Октябрь 06, 2010, 11:21 Я не знаю, может в дельфи и принято работать с указателями, но в c++/Qt есть еще такая штука как передача по значению, которая избавит от говной боли с утечками и невалидными указателями.
А вам стоит посмотреть http://doc.trolltech.com/4.7/widgets-shapedclock.html Вся хитрость в том, как сделать правильно регион из маски. Название: Re: Виджет по форме картинки Отправлено: Aleksey_Zh от Октябрь 06, 2010, 12:15 И я про то же К сожалению пока не выходит. А по ссылке - там регион не из маски создается. Там простой еллипс...
Название: Re: Виджет по форме картинки Отправлено: Авварон от Октябрь 06, 2010, 12:22 У региона есть конструктор от битмаски, я смотрел.
Название: Re: Виджет по форме картинки Отправлено: ufna от Октябрь 06, 2010, 12:27 +1 Авварону
а вообще - а что у тебя за image? я делаю вообще так (как второй вариант) - setMask(QPixmap("mymask.png").mask()); Название: Re: Виджет по форме картинки Отправлено: Aleksey_Zh от Октябрь 06, 2010, 13:05 +1 Авварону а вообще - а что у тебя за image? я делаю вообще так (как второй вариант) - setMask(QPixmap("mymask.png").mask()); image - это простая bmp картинка без прозрачности. Цвет обрезки - сначала задаю по первой точке, потом будет произвольно вводиться для повышения универсальности Название: Re: Виджет по форме картинки Отправлено: Xopxe от Октябрь 06, 2010, 14:17 Передаю привет Максу Шлею )))))))
Код: int main(int argc, char** argv) |