Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Nikita от Июль 30, 2005, 15:46



Название: Как сделать прозрачную кнопку?
Отправлено: Nikita от Июль 30, 2005, 15:46
Спасите, помогите!
Уже довольно много времени потратил на попытку создания custom кнопки. Проблема в том что никак не получается сделать её прозрачной. Надо чтобы на ней была только иконка и текст, а сквозь остальную область просвечивал фон...
(кнопку наследовал от QWidget)
Попытки сделать
setAttribute(Qt::WA_NoBackground,true); или
setAttribute(Qt::WA_NoSystemBackground,true);
приводят к тому что там где должен просевчивать фон, просвечивает бурда из видеопамяти... Так как же сделать такую кнопку не прибегая к setMask() и не задавая сложную область?
Пытался при этом отключать двойную буфферизацию       setAttribute(Qt::WA_PaintOnScreen,true); - не помогает...
Ведь в Виндах же можно сделать кнопку flat стиля, которая будет прозрачна... Как это возможно в Qt?


Название: Как сделать прозрачную кнопку?
Отправлено: Racheengel от Август 01, 2005, 13:26
если под кнопкой фон будет статичным, копай в сторону copyBlt...


Название: Как сделать прозрачную кнопку?
Отправлено: Racheengel от Август 01, 2005, 13:35
если под кнопкой фон будет статичным, копай в сторону copyBlt...


Название: Re: Как сделать прозрачную кнопку?
Отправлено: Zmey от Август 02, 2005, 11:43
Цитата: "Nikita"
Спасите, помогите!
Уже довольно много времени потратил на попытку создания custom кнопки. Проблема в том что никак не получается сделать её прозрачной. Надо чтобы на ней была только иконка и текст, а сквозь остальную область просвечивал фон...
(кнопку наследовал от QWidget)
Попытки сделать
setAttribute(Qt::WA_NoBackground,true); или
setAttribute(Qt::WA_NoSystemBackground,true);
приводят к тому что там где должен просевчивать фон, просвечивает бурда из видеопамяти... Так как же сделать такую кнопку не прибегая к setMask() и не задавая сложную область?
Пытался при этом отключать двойную буфферизацию       setAttribute(Qt::WA_PaintOnScreen,true); - не помогает...
Ведь в Виндах же можно сделать кнопку flat стиля, которая будет прозрачна... Как это возможно в Qt?


А иконка у тебя прозрачная? Или я чего-то не понимаю...


Название: Re: Как сделать прозрачную кнопку?
Отправлено: jindos от Август 02, 2005, 12:30
Цитата: "Zmey"

А иконка у тебя прозрачная? Или я чего-то не понимаю...


Иконка - это не рисунок на всю кнопку. Она может быть достаточно маленькой... Насколько я понимаю, имеется ввиду именно такая иконка, которая при помощи  setIconSet(QIconSet &icon) в дополнение к тексту ставится, а не изображение, которое при помощи setPixmap на кнопку рисуется вместо всего что на ней было (если было) ранее...

Вообще... Насколько я знаю, Qt плохо поддерживает прозрачность... Можно копнуть в сторону флагов QRasterOp... Например использовать для рисования флаг XorROP предварительно инвертнув фон...


Название: Как сделать прозрачную кнопку?
Отправлено: piton от Август 03, 2005, 14:30
ну вот я делал кнопку из картинки .bmp, с голубым фоном. фон не был виден...
Код:

...
closePushButton = new QPushButton(this, "closePushButton");
closePixmap_n = new QPixmap;
*closePixmap_n = QPixmap::fromMimeSource("power_n.bmp");
closePixmap_n->setMask( closePixmap_n->createHeuristicMask() );
closePushButton->setMask( *closePixmap_n->mask() );
closePushButton->setPixmap( *closePixmap_n );
closePushButton->setGeometry( 10, 464, closePixmap_n->width(), closePixmap_n->height() );
closePushButton->show();
...


а если в картинке есть прозрачный фон то еще проще делается
Код:

QPixmap pix("bla-bla.png");
if( pix.mask() ){
  pushButton->setMask( *pix.mask );
}
  pushButton->setPixmap( pix );


Название: Как сделать прозрачную кнопку?
Отправлено: piton от Август 03, 2005, 14:33
упс...тебе зачем-то не нужно setMask -((
тогда не знаю...


Название: Как сделать прозрачную кнопку?
Отправлено: Nikita от Август 12, 2005, 19:21
Я поясню, почему мне не хочется пользоваться setMask... Дело в том что мне надо максимально быстрый интерфейс, который сможет пахать даже на относительно старых компах типа 486 и P-I.  

setMask же - это некий аналог виндовых регионов (или наоборот :-). У элементов интерфейса, которые используют регионы гораздо больше производится арифметики при всевозможных событиях, например, когда такому control-у приходит MouseClick, он делает проверку на попадание точки в полигональную область (или проверку на попадание в какую-либо из подобластей, или ещё черта в ступе).

 Попробуйте написать две программки, у первой кнопки туллбара будут стандартными прямоугольниками а у второй - сложными областями. Когда напишете, повозите мышкой над этими кнопками и замерьте загрузку процессора. Поверьте, у прямоугольников загрузка будет на порядок меньше... А в моей проге дело не ограничивается одним тулбаром и потому мне хотелось бы иметь способ без SetMask...

 Вы не представляете сколькими способами я пытался решить проблему прозрачной кнопки, но в итоге ничего не получилось и в своих рукописных компонентах я написал кнопку, которая просто забирает у parent-a кусок области и использует в качестве своего задника...


Название: Как сделать прозрачную кнопку?
Отправлено: HECTEPOB от Ноябрь 01, 2005, 17:51
Была мысль скрывать контрол, ставить на отрисовывающий пайнтер флаг АНКЛИППЕД включать МаусТрекинг и рисовать контрол прямо на родителе.


Название: Как сделать прозрачную кнопку?
Отправлено: KiberSasha от Ноябрь 16, 2005, 21:57
You can try QWidget::SetBackgroundMode(Qt::NoBackground);