Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Осенний дождь от Апрель 26, 2007, 14:11



Название: [QT 4.2.2] Прозрачное окно с текстом
Отправлено: Осенний дождь от Апрель 26, 2007, 14:11
Добрый день, помоги с советом.
 
Нужно создать на рабочем столе окно которое выглядело бы как иконка Windows, т.е. На основном окне располагает кнопка с изображением, а под ней QLabel с текстом. Основное окно должно иметь прозрачный фон, так чтобы пользователю казалось бы что кнопка и текст QLabel находятся на рабочем столе сами по себе.

Пробовал сделать такое через setMask(QRegion) у основного окна
Код:
QRegion reg = childrenRegion();
setMask(reg);

Виден фон QLabel.
Код:
QPalette p = ui.label->palette();
p.setBrush(QPalette::Window,QBrush(QColor(255,255,255,0)));
ui.label->setAutoFillBackground(true);
ui.label->setPalette(p);

Теперь сквозь фон прозрачный фон QLabel виден фон основного окна. А его сделать прозрачным не получается, т.к. фон становиться не прозрачным, а черным. (Вероятно это потому, что окно сначала рисуется в буфер, а потом буфер копируется на экран. И промежуточный буфер по умолчанию заполнен черным цветом)

Тогда я попробовал сделать через setMask(QBitmap) , но для этого мне нужно сначала нарисовать окно в буфер, потом из этого буфер получить маску и наложить ее на окно. Но как нарисовать мое основное окно, вместе с дочерними виджетами в буфер, а не на экран?

Короче, мрак.


Название: [QT 4.2.2] Прозрачное окно с текстом
Отправлено: epazzz от Май 07, 2007, 18:29
при копировании Pixmapa в промежуточный буфер теряется маска.
Чтобы это избежать делай следующее:

1. берёшь маску оригинального изображения
QBitmap *mask=(QBitmap *)iProperties.iPixmap.mask();
2. копируешь оригинальный pixmap куда надо
bitBlt(pixmap, 0,0, &(iProperties.iPixmap))
3. востанавливаешь маску
pixmap->setMask(mask);