IT Notes

Qt: Эффекты прозрачности для окон

Продолжим работу над примером Qt-виджета с нестандартной рамкой. Сделаем окно полу-прозрачным. Для этого достаточно воспользоваться функцией QWidget::setWindowOpacity(). Добавим ее вызов в конструктор виджета:

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 );
}

В результате получаем:

semi-transparent-widget-qt-thumbnail

Но давайте пойдем дальше. Мы можем придать нашему окну произвольную форму, установив для него битовую маску. В качестве примера воспользуемся формой "облака с текстом" (прикрепленное изображение немного модифицировано, поэтому напрямую использоваться не может; рабочую маску можно загрузить вместе с исходниками по ссылке в конце статьи):

speech-bubble-mask

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

Для задания маски виджету необходимо:

  1. Загрузить изображение в виде QPixmap;
  2. Смасштабировать изображение по размеру окна;
  3. Извлечь маску изображения и установить ее для окна.

Добавим соответствующий код в конструктор DraggableWidget:

QPixmap maskPix( ":/images/mask.png" );
setMask( maskPix.scaled( size() ).mask() );

Получаем довольно интересный результат:

bubble-message-widget-qt-thumbnail

Выводы

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

Исходники

 Скачать пример полу-прозрачного Qt-виджета с нестандартной формой

Похожие публикации

Комментарии

Великолепно!

Спасибо за комментарий =)

Отлично! То что надо. Долго искал нечто подобное в Qt. Спасибо.

Пожалуйста =)