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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать прозрачную кнопку?  (Прочитано 19541 раз)
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
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Август 01, 2005, 13:26 »

если под кнопкой фон будет статичным, копай в сторону copyBlt...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Август 01, 2005, 13:35 »

если под кнопкой фон будет статичным, копай в сторону copyBlt...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Zmey
Гость
« Ответ #3 : Август 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?


А иконка у тебя прозрачная? Или я чего-то не понимаю...
Записан
jindos
Гость
« Ответ #4 : Август 02, 2005, 12:30 »

Цитата: "Zmey"

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


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

Вообще... Насколько я знаю, Qt плохо поддерживает прозрачность... Можно копнуть в сторону флагов QRasterOp... Например использовать для рисования флаг XorROP предварительно инвертнув фон...
Записан
piton
Гость
« Ответ #5 : Август 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
Гость
« Ответ #6 : Август 03, 2005, 14:33 »

упс...тебе зачем-то не нужно setMask -((
тогда не знаю...
Записан
Nikita
Гость
« Ответ #7 : Август 12, 2005, 19:21 »

Я поясню, почему мне не хочется пользоваться setMask... Дело в том что мне надо максимально быстрый интерфейс, который сможет пахать даже на относительно старых компах типа 486 и P-I.  

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

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

 Вы не представляете сколькими способами я пытался решить проблему прозрачной кнопки, но в итоге ничего не получилось и в своих рукописных компонентах я написал кнопку, которая просто забирает у parent-a кусок области и использует в качестве своего задника...
Записан
HECTEPOB
Гость
« Ответ #8 : Ноябрь 01, 2005, 17:51 »

Была мысль скрывать контрол, ставить на отрисовывающий пайнтер флаг АНКЛИППЕД включать МаусТрекинг и рисовать контрол прямо на родителе.
Записан
KiberSasha
Гость
« Ответ #9 : Ноябрь 16, 2005, 21:57 »

You can try QWidget::SetBackgroundMode(Qt::NoBackground);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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