Продолжим работу над примером Qt-виджета с нестандартной рамкой. Сделаем окно полу-прозрачным. Для этого достаточно воспользоваться функцией QWidget::setWindowOpacity(). Добавим ее вызов в конструктор виджета:
1 2 3 4 5 6 7 8 9 10 11 |
DraggableWidget::DraggableWidget( QWidget* parent ) : QWidget( parent, Qt::Window | Qt::FramelessWindowHint ), ui( new Ui::DraggableWidget ), dx( 0 ), dy( 0 ) { ui->setupUi( this ); ui->lbTitle->setText( windowTitle() ); connect( ui->btnQuit, SIGNAL( clicked( bool ) ), qApp, SLOT( quit() ) ); setWindowOpacity( 0.8 ); } |
В результате получаем:
Но давайте пойдем дальше. Мы можем придать нашему окну произвольную форму, установив для него битовую маску. В качестве примера воспользуемся формой «облака с текстом» (прикрепленное изображение немного модифицировано, поэтому напрямую использоваться не может; рабочую маску можно загрузить вместе с исходниками по ссылке в конце статьи):
Изображение-маска формируется таким оразом, чтобы лишняя часть была полностью прозрачной (в соответствии с альфа-каналом). Все непрозрачные части изображения определяют форму окна. При этом цвет пикселей значения не имеет.
Для задания маски виджету необходимо:
- Загрузить изображение в виде QPixmap;
- Смасштабировать изображение по размеру окна;
- Извлечь маску изображения и установить ее для окна.
Добавим соответствующий код в конструктор DraggableWidget:
1 2 |
QPixmap maskPix( ":/images/mask.png" ); setMask( maskPix.scaled( size() ).mask() ); |
Получаем довольно интересный результат:
Выводы
Комбинируя рассмотренные приемы можно создавать весьма оригинальные виджеты, которые помогут вашим приложениям выделиться на фоне других. Все ограничивается вашей фантазией.