Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: izoomer от Октябрь 04, 2007, 11:10



Название: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: izoomer от Октябрь 04, 2007, 11:10
Есть JExplorer созданый от QDialog, хотел сделать прозрачным диалог так :
Код:
void JExplorer::paintEvent(QPaintEvent * /* event */){
QPainter p;
p.begin(this);
p.setRenderHint(QPainter::Antialiasing, true);
p.setBrush(QColor(0,0,0,100));
p.setPen( Qt::NoPen );
p.drawRect( rect() );
p.setBrush( QColor( 37, 86, 145 ) );
QPen pen(QColor( 28, 64, 109 ), 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
p.setPen(pen);
p.drawRoundRect( QRect(50, 110, 325, 380), 10, 6 );
p.drawRoundRect( QRect(425, 150, 325, 300), 10, 6 );
p.end();
}

а не рисуется прозрачный rect ... отчего вдруг ? аналогичный код для класа от QWidget работает


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: Dendy от Октябрь 04, 2007, 13:28
Забыли указать прозрачность?

Код:
p.setBrush( QColor( 37, 86, 145, ??? ) );

Или что вы подразумеваете под прозрачным окном?


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: Racheengel от Октябрь 04, 2007, 14:36
Кстати, да, тоже замечал такой баг под линуксом.

К примеру после

    QPainter p(this);
    p.setOpacity(0.5);

под виндой дальнейшая отрисовка будет полупрозрачной, под линуксом - нет.


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: izoomer от Октябрь 05, 2007, 12:58
Забыли указать прозрачность?

Код:
p.setBrush( QColor( 37, 86, 145, ??? ) );

Или что вы подразумеваете под прозрачным окном?

нет, не в этом месте ...
Код:
void JExplorer::paintEvent(QPaintEvent * /* event */){
QPainter p;
p.begin(this);
p.setRenderHint(QPainter::Antialiasing, true);
p.setBrush(QColor(0,0,0,100));
p.setPen( Qt::NoPen );
p.drawRect( rect() );

...
...
...
}

вот этот код рисует прозрачный фон для окна (на все окно) , а затем на этом прозрачном фоне рисуется все остальное ... однако этот вот самый фон не рисуется прозрачным.


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: Dodge от Октябрь 05, 2007, 13:13
На скока я понимаю, паинтер не ресует само окно... он рисует поверх него, и как следствие нарисовать на окне прозрачную область не означает сделать прозрачным само окно.


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: izoomer от Октябрь 05, 2007, 13:27
На скока я понимаю, паинтер не ресует само окно... он рисует поверх него, и как следствие нарисовать на окне прозрачную область не означает сделать прозрачным само окно.
painter рисует само окно , и в paintEvent рисуем все что захотим, то есть как будет выглядеть окно ... вот и для QWidget если нарисовать прозрачный QRect на все пространство ( QWidget::rect() ) то получим QWidget с заданной прозрачностью . Но у меня почему то для одного QWidget работает , а для QDialog не хочет ... странно.


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: yshurik от Октябрь 06, 2007, 00:15
Не будет работать так как нужна поддержка оконной системы.
Вы можете рисовать любые полупрозрачные видгеты поверх основного
окна которое не будет полупрозрачным через paintEvent.

В данном случае QMainWindow не будет полупрозрачным и QDialog тоже
(это разные окна оконной системы)

Поверх них - пожалуйста (когда они parent для ваших widgets)


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: SLiDER от Октябрь 06, 2007, 01:02
Что-то мне подсказывает, что в Linux чтобы получить прозрачное окно вам как минимум еще нужно иметь композитный менеджер окон (compiz? beryl?). Тут как-то пробегала ссылка на блог Zack Rusin, и у него там был примерчик на эту тему, кажется с птичкой в качестве главной формы. Вот вам прямой линк http://zrusin.blogspot.com/2006_10_01_archive.html, статейка называется "ARGB windows". Удачи.


Название: Re: [qt-4.2.0 Linux] Не рисует прозрачное окно
Отправлено: Dodge от Октябрь 08, 2007, 10:47
painter рисует само окно , и в paintEvent рисуем все что захотим, то есть как будет выглядеть окно ... вот и для QWidget если нарисовать прозрачный QRect на все пространство ( QWidget::rect() ) то получим QWidget с заданной прозрачностью . Но у меня почему то для одного QWidget работает , а для QDialog не хочет ... странно.
Вот просто слов нету, кроме как - аффтар убей себя ап стену...

ПАИНТЕР НЕ РИСУЕТ ОКНО!!!
Окно рисует оконная система, и если нарисовать прозрачную область на окне(При помощи паинтера), это не даст эффект прозрачности для самого окна, это дасть эффект прозрачности для уже нарисованных элементов на окне!

З.Ы. если у аффтора есть код, который с использованием QPainter'а делает окно прозрачным, то предлагаю объявить данного оратора мегашаманом программирования, выдать имменной бубен и послать работать в мелкосовт, там такие нужны.