Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kxk от Сентябрь 12, 2011, 09:00



Название: Прозрачность окна.
Отправлено: kxk от Сентябрь 12, 2011, 09:00
Необходимо сделать прозрачность окна но при этом чтобы label который находится на этом окне с gif анимацией оставался не прозрачным. Помогите пожалуйста.


Название: Re: Прозрачность окна.
Отправлено: Fess от Сентябрь 12, 2011, 10:44
Насколько я помню, прозрачность применяется ко всему toplevel окну. Настройка прозрачности отдельных виджетов не поддерживается.
А какая задача-то? Может есть другой путь решения проблемы?


Название: Re: Прозрачность окна.
Отправлено: Nimbus от Сентябрь 12, 2011, 10:47
http://doc.qt.nokia.com/latest/qwidget.html#setMask
Только там либо полностью прозрачно, либо нет


Название: Re: Прозрачность окна.
Отправлено: Fregloin от Сентябрь 12, 2011, 14:14
ну если это win vista,7 то можно использовать glass эффект, правда как это прикрутить в qt я не в курсе, в остальных случаях это практически нереализуемо. Разве что рисовать в bitmap все, а label накладывать и потом отображать в окне (хотя как по мне это дикий гемморой и тормоза)


Название: Re: Прозрачность окна.
Отправлено: Drafter от Сентябрь 12, 2011, 16:46
Как-то так...

Код
C++ (Qt)
#include <QtCore>
#include <QtGui>
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
   QWidget w;
   w.setAttribute(Qt::WA_TranslucentBackground, true);
   w.setWindowFlags(Qt::FramelessWindowHint);
   QLabel *lbl = new QLabel("The Label", &w);
   w.show();
   return app.exec();
}


Название: Re: Прозрачность окна.
Отправлено: Fess от Сентябрь 12, 2011, 17:37
Можно реализовать свой класс окна и переопределить в нем метод отрисовки в котором в качестве фона выводить изображение с альфа каналом нужной прозрачности. На все это уже поместить лейбл с гифкой.


Название: Re: Прозрачность окна.
Отправлено: Drafter от Сентябрь 12, 2011, 23:46
Цитировать
Можно реализовать свой класс окна и переопределить в нем метод отрисовки в котором в качестве фона выводить изображение с альфа каналом нужной прозрачности.

Любой виджет и так (неявно) - изображение. Поэтому достаточно в paintEvent привязать к нему QPainter'а и закрасить в (полу)прозрачный цвет.

Код
C++ (Qt)
void TransparentWidget::paintEvent(QPaintEvent *event)
{
       QPainter p(this);
       p.fillRect(event->rect(), Qt::transparent);
       p.end();
}
 

При этом, если виджет выступает в роли главного окна приложения, надо включить ему атрибут setAttribute(Qt::WA_TranslucentBackground, true), и убрать системную рамку setWindowFlags(Qt::FramelessWindowHint).


Название: Re: Прозрачность окна.
Отправлено: kxk от Сентябрь 13, 2011, 06:26
Большое всем спасибо вот решение

Код:
    ui->setupUi(this);
    QMovie *movie = new QMovie("D:/01.gif");
    ui->label->setMovie(movie);
    movie->start();
    this->setAttribute(Qt::WA_TranslucentBackground );
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);