Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Aleksey_Zh от Октябрь 06, 2010, 10:22



Название: Виджет по форме картинки
Отправлено: 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)
{
    QApplication app(argc, argv);
    QLabel       win;
    QPixmap      pix("41.bmp");
    QPixmap alfaPixmap=pix.createMaskFromColor(QColor(102,204,51),Qt::MaskOutColor);
    pix.setAlphaChannel(alfaPixmap);

    win.setPixmap(pix);
    win.setMask(pix.mask());
    win.show();

    return app.exec();
}