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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виджет по форме картинки  (Прочитано 5639 раз)
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
}


В конечном итоге получается либо просто черно-белое изображение на виджете, либо вообще никак.
Нужно - сделать виджет по форме картинки. В качестве картинки - использовать бмп-шку и цвет прозрачности. При наведении мыши на фиджет - должно возникать соотв. событие, но только если мышь над закрашеной областью...

Что я делаю не так?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Октябрь 06, 2010, 10:51 »

Судя по данному коду - ВСЁ. Кривые названия переменных, передача по значению, утечка в виде new QBitmap;
А по сабжу - маска как раз использует альфа-канал, насколько я знаю, посему для начала стоит убрать Qt::NoAlpha
Записан
Aleksey_Zh
Гость
« Ответ #2 : Октябрь 06, 2010, 11:13 »

Судя по данному коду - ВСЁ. Кривые названия переменных, передача по значению, утечка в виде new QBitmap;
А по сабжу - маска как раз использует альфа-канал, насколько я знаю, посему для начала стоит убрать Qt::NoAlpha
Если название переменных не нравится - это не значит что они не правильные. Что не правильно по существу?

P.S. - Qt::NoAlpha убрал - поставил Qt::ColorMode_Mask (точно не уверен, но думаю более уместно) ). Тем не менее ничего так и не изменилось.

Если есть (в чем не сомневаюсь, просто нужного не нашел) подобные темы с подобными проблемами - буду благодарен за ссылку
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Октябрь 06, 2010, 11:21 »

Я не знаю, может в дельфи и принято работать с указателями, но в c++/Qt есть еще такая штука как передача по значению, которая избавит от говной боли с утечками и невалидными указателями.
А вам стоит посмотреть http://doc.trolltech.com/4.7/widgets-shapedclock.html
Вся хитрость в том, как сделать правильно регион из маски.
Записан
Aleksey_Zh
Гость
« Ответ #4 : Октябрь 06, 2010, 12:15 »

И я про то же  К сожалению пока не выходит. А по ссылке - там регион не из маски создается. Там простой еллипс...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Октябрь 06, 2010, 12:22 »

У региона есть конструктор от битмаски, я смотрел.
Записан
ufna
Гость
« Ответ #6 : Октябрь 06, 2010, 12:27 »

+1 Авварону

а вообще - а что у тебя за image?

я делаю вообще так (как второй вариант) -
setMask(QPixmap("mymask.png").mask());
Записан
Aleksey_Zh
Гость
« Ответ #7 : Октябрь 06, 2010, 13:05 »

+1 Авварону

а вообще - а что у тебя за image?

я делаю вообще так (как второй вариант) -
setMask(QPixmap("mymask.png").mask());

image - это простая bmp картинка без прозрачности. Цвет обрезки - сначала задаю по первой точке, потом будет произвольно вводиться для повышения универсальности
Записан
Xopxe
Гость
« Ответ #8 : Октябрь 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();
}
« Последнее редактирование: Октябрь 06, 2010, 14:34 от Xopxe » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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