Russian Qt Forum
Ноябрь 25, 2024, 01:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: PNG как окно программы (c красивой прозрачностью)  (Прочитано 9373 раз)
jeno
Гость
« : Апрель 23, 2010, 02:01 »

добрый день.

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

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

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

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

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

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

заранее спасибо)
Записан
fuCtor
Гость
« Ответ #1 : Апрель 23, 2010, 07:00 »

Код
C++ (Qt)
setAttribute(Qt::WA_TranslucentBackground); // Главное этот флаг
setMask(QPixmap(":/splash/mask"));
 

А потом в методе  eventPaint рисуйте что хотите.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Апрель 23, 2010, 08:19 »

Цитировать
setAttribute(Qt::WA_TranslucentBackground);
Имейте в виду, что под X-ами это не работает.
Записан

Qt 5.11/4.8.7 (X11/Win)
SABROG
Гость
« Ответ #3 : Апрель 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, но не уверен.
Это из другого поста годичной давности. Не пойму как, но ваше сомнение перерасло в утверждение. Видимо потому, что вы не пытались найти информацию.
Записан
fuCtor
Гость
« Ответ #4 : Апрель 23, 2010, 08:45 »

svn://labs.trolltech.com/svn/graphics/dojo/glossygradients вот он этот пример
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Апрель 23, 2010, 08:46 »

SABROG
Цитировать
Это из другого поста годичной давности. Не пойму как, но ваше сомнение перерасло в утверждение.
Да, можно так сказать. Объясню почему. Не все линуксы из коробки имеют настроенный Compiz.
На других unix-aх такой поддержки нет вовсе.
WM под Compiz имеет множество ограничений по сравнению с тем же kwin-ом.
Поэтому исходя из соображений универсальности, я бы под X-ами вообще бы не заморачивался с прозрачностью, либо
сделал поддержку режима без прозрачности.
Записан

Qt 5.11/4.8.7 (X11/Win)
SABROG
Гость
« Ответ #6 : Апрель 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, которых может не быть на целевых платформах, как об этом пишут тролли. Споры то они как раз и возникают по причине того, что большинство обычных пользователей не встречали таких платформ.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Апрель 23, 2010, 09:53 »

Цитировать
svn://labs.trolltech.com/svn/graphics/dojo/glossygradients вот он этот пример
Чего-то не достать никак, а в http://qt.gitorious.org/qt-labs/graphics-dojo нет такого.
Записан

Qt 5.11/4.8.7 (X11/Win)
SABROG
Гость
« Ответ #8 : Апрель 23, 2010, 13:08 »

Цитировать
svn://labs.trolltech.com/svn/graphics/dojo/glossygradients вот он этот пример
Чего-то не достать никак, а в http://qt.gitorious.org/qt-labs/graphics-dojo нет такого.

Раньше в dojo было много интересных программ, но их исходники безвозвратно пропали.
Записан
jeno
Гость
« Ответ #9 : Апрель 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 и все что после него) )
Записан
fuCtor
Гость
« Ответ #10 : Апрель 23, 2010, 20:41 »


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

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Апрель 23, 2010, 21:11 »

jeno
пиксмап тоже лучше вынести а не грузить каждый раз из файла

по поводу статики... косяков больше чем плюсов (плагины и тп) + lgpl вроде нарушается
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Апрель 23, 2010, 21:12 »

присоединяйтесь по поводу старого хранилища:
http://labs.trolltech.com/forums/topic/2000?replies=5
врятли троли его просто прибили.
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 26.