Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jeno от Апрель 23, 2010, 02:01



Название: PNG как окно программы (c красивой прозрачностью)
Отправлено: jeno от Апрель 23, 2010, 02:01
добрый день.

я новичок в qt, и вот придумал себе первое задание)
хочу написать программу управления громкостью (по горячим глобальным клавишам)...

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

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

я так понял для этого нужно использовать PNG с его alpha прозрачностью...
пол дня бьюсь головой об клавиатуру, нашел примеры с использованием маски...выводим изображение, загружаем маску прозрачности (где должно быть прозрачно) и вырезаем...

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

реально ли сделать qwidget внешне как PNG со всеми его прозрачностями? (чтоб оно было так же плавно, переходило в прозрачный плавно)

заранее спасибо)


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: fuCtor от Апрель 23, 2010, 07:00
Код
C++ (Qt)
setAttribute(Qt::WA_TranslucentBackground); // Главное этот флаг
setMask(QPixmap(":/splash/mask"));
 

А потом в методе  eventPaint рисуйте что хотите.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: GreatSnake от Апрель 23, 2010, 08:19
Цитировать
setAttribute(Qt::WA_TranslucentBackground);
Имейте в виду, что под X-ами это не работает.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: SABROG от Апрель 23, 2010, 08:33
Цитировать
setAttribute(Qt::WA_TranslucentBackground);
Имейте в виду, что под X-ами это не работает.
Работает. Всё зависит от настроек оконного менеджера

Цитировать
Creating Translucent Windows

Since Qt 4.5, it has been possible to create windows with translucent regions on window systems that support compositing.

To enable this feature in a top-level widget, set its Qt::WA_TranslucentBackground attribute with setAttribute() and ensure that its background is painted with non-opaque colors in the regions you want to be partially transparent.

Platform notes:

    * X11: This feature relies on the use of an X server that supports ARGB visuals and a compositing window manager.
    * Windows: The widget needs to have the Qt::FramelessWindowHint window flag set for the translucency to work.

Где-то видел демку, где итемы QGraphicsScene прямо на рабочем столе отображаются, без фона QGraphicsView. Сейчас не могу её найти.

Под стандартными X11 всё это работать не будет, т.к. для не прямоугольных окон нужно использовать XShapeExtension.
Хотя может будет работать, если включить Compiz, но не уверен.
Это из другого поста годичной давности. Не пойму как, но ваше сомнение перерасло в утверждение. Видимо потому, что вы не пытались найти информацию.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: fuCtor от Апрель 23, 2010, 08:45
svn://labs.trolltech.com/svn/graphics/dojo/glossygradients вот он этот пример


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: GreatSnake от Апрель 23, 2010, 08:46
SABROG
Цитировать
Это из другого поста годичной давности. Не пойму как, но ваше сомнение перерасло в утверждение.
Да, можно так сказать. Объясню почему. Не все линуксы из коробки имеют настроенный Compiz.
На других unix-aх такой поддержки нет вовсе.
WM под Compiz имеет множество ограничений по сравнению с тем же kwin-ом.
Поэтому исходя из соображений универсальности, я бы под X-ами вообще бы не заморачивался с прозрачностью, либо
сделал поддержку режима без прозрачности.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: SABROG от Апрель 23, 2010, 09:04
svn://labs.trolltech.com/svn/graphics/dojo/glossygradients вот он этот пример

Ну да, вот пост из блога http://labs.trolltech.com/blogs/2008/09/23/translucent-widgets-on-x11/

Да, можно так сказать. Объясню почему. Не все линуксы из коробки имеют настроенный Compiz.
На других unix-aх такой поддержки нет вовсе.
WM под Compiz имеет множество ограничений по сравнению с тем же kwin-ом.
Поэтому исходя из соображений универсальности, я бы под X-ами вообще бы не заморачивался с прозрачностью, либо
сделал поддержку режима без прозрачности.
На сколько я знаю сейчас большинство современных дистрибутивов Linux, тот же Ubuntu имеют такую поддержку. То есть большинство обычных "домашних" пользователей будут работать с програмой нормально. Остальные, а это, как правило, "корпоративные" пользователи в силу ряда технологических/моральных/финансовых ограничений могут использовать дистрибутивы, которые предназначены для мониторинга и управления различными девайсами о которых обычные пользователи слыхом не слыхали. Моё мнение в пользу использования translucent - скорее Да, чем Нет. Но как обычно, всё зависит от задачи, где и как будут использовать приложение и т.д. Это скорее из области споров на счет использования exceptions, stl и т.п. вещей в Qt, которых может не быть на целевых платформах, как об этом пишут тролли. Споры то они как раз и возникают по причине того, что большинство обычных пользователей не встречали таких платформ.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: GreatSnake от Апрель 23, 2010, 09:53
Цитировать
svn://labs.trolltech.com/svn/graphics/dojo/glossygradients вот он этот пример
Чего-то не достать никак, а в http://qt.gitorious.org/qt-labs/graphics-dojo нет такого.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: SABROG от Апрель 23, 2010, 13:08
Цитировать
svn://labs.trolltech.com/svn/graphics/dojo/glossygradients вот он этот пример
Чего-то не достать никак, а в http://qt.gitorious.org/qt-labs/graphics-dojo нет такого.

Раньше в dojo было много интересных программ, но их исходники безвозвратно пропали.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: jeno от Апрель 23, 2010, 19:05
Огромное всем спасибо=) сработал (проверял правда только в windows 7)

вот только setMask(); не понадобилось...

просто вот так:
Код
QPainter painter(this);
QPixmap background("c:\\1.png");
painter.drawPixmap(0,0,background.width(),background.height(),background);

ну и
Код
setAttribute(Qt::WA_TranslucentBackground);
добавил в resizeEvent

--

я рассчитываю на windows7,vista,xp...из линуксов наверное ubuntu) не столь важно...и действительно, для других можно сделать без прозрачности =) (вообще, я сейчас это только для себя делаю...но было бы интересно сделать его под большинство платформ)

вечером буду разбираться как в Qt собирать статичный exe (чтоб программа была в одной файле, без DLL и т.д. чтоб ее можно было запустить на любом windows (ну разумеется, XP и все что после него) )


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: fuCtor от Апрель 23, 2010, 20:41

ну и
Код
setAttribute(Qt::WA_TranslucentBackground);
добавил в resizeEvent
Достаточно один раз устанавливать, флаг не сбрасывается в процессе.


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: Авварон от Апрель 23, 2010, 21:11
jeno
пиксмап тоже лучше вынести а не грузить каждый раз из файла

по поводу статики... косяков больше чем плюсов (плагины и тп) + lgpl вроде нарушается


Название: Re: PNG как окно программы (c красивой прозрачностью)
Отправлено: lit-uriy от Апрель 23, 2010, 21:12
присоединяйтесь по поводу старого хранилища:
http://labs.trolltech.com/forums/topic/2000?replies=5
врятли троли его просто прибили.