Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ Полупрозрачность

Автор: kwisp 25.2.2009, 13:34

реализовывал ли кто нибудь полупрозрачность???

Автор: ViGOur 25.2.2009, 13:45

QPainter::setOpacity

Глянь: http://www.forum.crossplatform.ru/index.php?s=&showtopic=981&view=findpost&p=14354

Автор: kwisp 25.2.2009, 13:55

Цитата(ViGOur @ 25.2.2009, 13:45) *
QPainter::setOpacity


спасибо,
немного не то.
этот метод делает кучу пикселей прозрачными и распределяет по непрозрачной области смотрится не важно вообще.

ищу сейчас красивую полупрозрачность...

Автор: ViGOur 25.2.2009, 14:47

Цитата(kwisp @ 25.2.2009, 13:55) *
ищу сейчас красивую полупрозрачность...
Это как? :)

Картинку полупрозрачную?

Автор: kwisp 25.2.2009, 15:09

Цитата(ViGOur @ 25.2.2009, 14:47) *
Это как?


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

Автор: SABROG 25.2.2009, 15:31

Цитата(kwisp @ 25.2.2009, 15:09) *
да вот коллега по работе гооврит что нельзя сделать в Qt полупрозрачнео меню без рамки

Он прав. В Qt нет средств, чтобы делать это кроссплатформенно. Отдельно для каждой платформы - не вопрос. Да и то может потребоваться в xorg.conf прописать настройки, чтобы поддерживалась композиция.

FAQ троллей: http://www.qtsoftware.com/developer/faqs/faq.2007-02-08.3940505976

http://www.qtcentre.org/forum/f-qt-programming-2/t-argb-windows-on-windows-8395.html

Автор: void* 25.2.2009, 15:32

единственное что еще подобное есть насколько я знаю это QWidget::setWindowOpacity(qreal)
хотя это походу не то...

Автор: SABROG 25.2.2009, 15:40

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

Автор: kwisp 25.2.2009, 16:05

Цитата(SABROG @ 25.2.2009, 15:31) *
Он прав.

досадно.
он сейчас сидит разбирается с оверлеем.

будем думать дальше:)

а если изменить задачу.
пустья qt методами показываю фильм и хочу повех его показать полупрозрачное меню.
есть варианты??

Автор: SABROG 25.2.2009, 16:30

Цитата(kwisp @ 25.2.2009, 16:05) *
пустья qt методами показываю фильм и хочу повех его показать полупрозрачное меню.
есть варианты??


Да, переопределить paintEvent у того виджета, что будет показывать видео и рисовать что угодно, тогда прокатит. Хотя я бы тогда попробовал рисовать сразу на видео фрейм.

Нашел исходник QAlphaWidget - http://www.qtwiki.de/wiki/ARGB_Widgets_unter_Windows Работает только под винду, судя по всему.

Автор: kwisp 27.2.2009, 15:18

никто пример с птичкой не качал?
у меня не получается слить его
:(

svn://labs.trolltech.com/svn/graphics/dojo/argb

везде ссылки на него а кода нет....

Автор: SABROG 27.2.2009, 15:56

Пример с птичкой работает только под X'ами. Вот держи: http://ktown.kde.org/~zrusin/examples/argb.tar.bz2

Автор: kwisp 27.2.2009, 16:02

Цитата(SABROG @ 27.2.2009, 15:56) *
Пример с птичкой работает только под X'ами. Вот держи:


под ними родимыми и надо.

спасибо тебе добрый человек.

Автор: Litkevich Yuriy 27.2.2009, 17:35

Цитата(kwisp @ 27.2.2009, 18:18) *
у меня не получается слить его
а что не получается, запусти KDESVN и извлеки рабочую копию.

Автор: kwisp 27.2.2009, 17:38

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

Автор: SABROG 5.3.2009, 22:17

Поздравляю, в 4.5 добавили возможность частичной полу-прозрачности:

Цитата
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: This feature requires Windows 2000 or later.

Автор: kwisp 6.3.2009, 0:02

Цитата(SABROG @ 5.3.2009, 22:17) *
Поздравляю, в 4.5 добавили возможность частичной полу-прозрачности:

клева.
жаль только в текущем проекте мне это не поможет. скорее всего будет отрисовка прям в оверлей фрейм и производиться не мной ...
но на будущее:) огого!!!
да и так очень приятно.

Автор: SABROG 6.3.2009, 0:31

Там есть одна особенность без которой ничего не работает :)

Написал демку в http://vingrad.ru/blogs/sabrog/?p=107&preview=true как сделать такое окно:


Автор: kwisp 6.3.2009, 9:31

Цитата(SABROG @ 6.3.2009, 0:31) *
Там есть одна особенность без которой ничего не работает

это ты о чем?
об оверлее что ли? или о прозрачности вообще.

Автор: SABROG 6.3.2009, 10:03

Цитата(kwisp @ 6.3.2009, 9:31) *
Цитата(SABROG @ 6.3.2009, 0:31) *
Там есть одна особенность без которой ничего не работает

это ты о чем?
об оверлее что ли? или о прозрачности вообще.

О флаге Qt::FramelessWindowHint. Без него не будет никакой прозрачности.

Немного в другую тему, но меня порадовала технология "Alien Widget". Пользователь думает, что перед ним обычное окно на базе ядра ОС, а на деле в программе может быть всего одно реальное окно - родительское и любое количество дочерних, которые окнами не являются, не имеют winid и всякими findwindow, spy и прочем не находятся. По сути - нарисованные на главном окне.
Если я не ошибаюсь, то для windows порог GDI объектов - 10000. А для Qt теперь этот порог ограничивается разве что мощностью компьютера.

Автор: log1c 6.3.2009, 10:05

А сделать, например, чтобы окно было полупрозрачным (не целиком прозрачным как с помощью этой фишки), а сами child`ы непрозрачные, можно?

Автор: SABROG 6.3.2009, 11:54

Цитата(log1c @ 6.3.2009, 10:05) *
не целиком прозрачным как с помощью этой фишки

А где ты здесь увидел полную прозрачность.

Автор: log1c 6.3.2009, 12:03

Я имел ввиду полную прозрачность главного виджета, без учета его чайлдов.

Автор: SABROG 6.3.2009, 12:12

Цитата(log1c @ 6.3.2009, 12:03) *
Я имел ввиду полную прозрачность главного виджета, без учета его чайлдов.

Я так думаю, что setOpacity в этом случае не сработает. Надо будет самому переопределять paintEvent главного окна и рисовать прозрачность в тех местах где тебе надо.

Автор: kwisp 6.3.2009, 12:17

Цитата(SABROG @ 6.3.2009, 10:03) *
О флаге Qt::FramelessWindowHint. Без него не будет никакой прозрачности.

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

Автор: SABROG 6.3.2009, 22:42

Цитата(log1c @ 6.3.2009, 12:03) *
Я имел ввиду полную прозрачность главного виджета, без учета его чайлдов.

Так можно:

Автор: log1c 6.3.2009, 23:51

ну ет не сапсем то ;)

Автор: SABROG 6.3.2009, 23:55

Цитата(log1c @ 6.3.2009, 23:51) *
ну ет не сапсем то ;)

Нарисуй как ты это видишь.

Автор: log1c 7.3.2009, 0:40

Ну вот смотри, есть виджет, на нем кнопка, сделать чтобы виджет был наполовину прозрачным, а кнопка была целиком непрозрачной (тоесть обычной).

Автор: kwisp 8.3.2009, 12:29

log1c,
по моему кнопка вторая снизу которая под фокусом именно такая.

Цитата(log1c @ 7.3.2009, 0:40) *
виджет был наполовину прозрачным, а кнопка была целиком непрозрачной (тоесть обычной).

Автор: log1c 8.3.2009, 12:58

Цитата(kwisp @ 8.3.2009, 12:29) *
log1c,
по моему кнопка вторая снизу которая под фокусом именно такая.
Цитата(log1c @ 7.3.2009, 0:40) *
виджет был наполовину прозрачным, а кнопка была целиком непрозрачной (тоесть обычной).



Под наполовину прозрачным я подразумевал не обрезание виджета в некоторой области видимости, а альфа канал :)

Автор: kwisp 8.3.2009, 13:00

Цитата(log1c @ 8.3.2009, 12:58) *
Под наполовину прозрачным я подразумевал не обрезание виджета в некоторой области видимости, а альфа канал

посмотри внимательно на кнопку которая под фокусом.:) !!!! она единственная необрезанная.

Автор: log1c 8.3.2009, 13:29

Цитата(kwisp @ 8.3.2009, 13:00) *
Цитата(log1c @ 8.3.2009, 12:58) *
Под наполовину прозрачным я подразумевал не обрезание виджета в некоторой области видимости, а альфа канал

посмотри внимательно на кнопку которая под фокусом.:) !!!! она единственная необрезанная.


Да я вижу))) Но где там видно, чтобы виджет, которому принадежит кнопка, был полупрозрачным (я вижу там виджет обрезанный пиксмапом) ;) Давай по-другому, вот представь, нету там никакого пиксмапа, обычный виджет, на нем обычная кнопка)) Сделать так чтобы виджет был полупрозрачным (ну или с любой другой частотой альфа-канала), а кнопка была обычной...

Автор: kwisp 8.3.2009, 13:35

Цитата(log1c @ 8.3.2009, 13:29) *
Но где там видно, чтобы виджет, которому принадежит кнопка, был полупрозрачным

блин или я туплю или одно из двух. :(

что мешает использовать полупрозрачную картинку в фоне виджета или самому отрисовывать его фон, или именно принципиально то что нельзя использовать маски картинок???
на картинке которую прикрепил SABROG к своему посту на синем полупрозрачном кружке не написано что это картинка, что мешает сделать не кружок а прямоугольник?? и визуально будешь считать что это виджет.

Автор: log1c 8.3.2009, 13:45

Цитата(kwisp @ 8.3.2009, 13:35) *
Цитата(log1c @ 8.3.2009, 13:29) *
Но где там видно, чтобы виджет, которому принадежит кнопка, был полупрозрачным

блин или я туплю или одно из двух. :(

что мешает использовать полупрозрачную картинку в фоне виджета или самому отрисовывать его фон, или именно принципиально то что нельзя использовать маски картинок???
на картинке которую прикрепил SABROG к своему посту на синем полупрозрачном кружке не написано что это картинка, что мешает сделать не кружок а прямоугольник?? и визуально будешь считать что это виджет.


Ну так то да, так сделать то можно, но я спрашивал именно не применяя ничего лишнего к виджету, основываясь чисто не пропертях виджета :)

[оффтоп]
Почему я не могу отправить личное сообщение юзверю на этом форуме :)
[/оффтоп]

Автор: kwisp 8.3.2009, 13:54

log1c,
ясно.
только я в псостах выше ни слова не нашел что только через свойства виджета без

Цитата(log1c @ 8.3.2009, 13:45) *
ничего лишнего к виджету,

:(

P.S.
впредь постараюсь читать между строк.

Автор: log1c 8.3.2009, 13:56

Цитата(kwisp @ 8.3.2009, 13:54) *
log1c,
ясно.
только я в псостах выше ни слова не нашел что только через свойства виджета без
Цитата(log1c @ 8.3.2009, 13:45) *
ничего лишнего к виджету,

:(

P.S.
впредь постараюсь читать между строк.


Извините за это, каюсь :(

Автор: SABROG 8.3.2009, 14:56

Цитата(log1c @ 8.3.2009, 13:45) *
...но я спрашивал именно не применяя ничего лишнего к виджету, основываясь чисто не пропертях виджета :)

Извини конечно, но я ничего доказывать не должен. Потратил бы ты 5 минут своего времени, чтобы почитать документацию и понял бы сам, что все возможно:

Скажу лишь, что в paintEvent всего 4 строчек кода. Конструктор QPainter'a и 3 строчки на манипуляцию с альфа-каналом.

У первого виджета QGroupBox autoFillBackground=false, у второго true. Альфа-канал я контролирую сам, виджет не отрисовываю, маски не ставлю.

Я конечно понимаю, что всем хочется скопировать Vist'у, но прилагайте свои усилия тоже...

P.S.: titlebar'a нету, т.к. не работает эта функция без флага Qt::FramelessWindowHint

Автор: log1c 8.3.2009, 15:53

да лично в моих целях меня устраивает и полная прозрачность виджета, а это я просто спросил, и никого ничего доказывать я не просил, так что зря ты так <_<

но все равно спасибо :clapping:

Автор: SABROG 8.3.2009, 15:55

Цитата(log1c @ 8.3.2009, 15:50) *
да лично в моих целях меня устраивает и полная прозрачность виджета, а это я просто спросил, и никого ничего доказывать я не просил, так что зря ты так <_<

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

Автор: log1c 8.3.2009, 16:05

Ладно, спасибо тебе :) Думаю не буим писать оффтоп тут, мож у кого еще вопросы появяца про прозрачность :)

Автор: kwisp 8.3.2009, 16:25

Цитата(SABROG @ 8.3.2009, 15:55) *
а мне говорят "это не то, хочу без округлостей".

+1
извините что не в тему:)
и у меня такое присутствует. сформулирует вопрос кто нить не полностью и понеслась ответы типа:
Цитата
да это то понятно я хочу и (приводят факт который не указывали в первом посте)

и так в 10 сообщениях выясняется что же нужно на самом деле?
это ведет к росту темы по сообщениям и сложно отследить конечную цель. засадная вещь вообще.

Автор: log1c 8.3.2009, 16:31

да ладно вам, зато скока всего интересного написали, вдруг кому-то понадобится именно то, что вы писали, зайдет в топик и вот оно! :rolleyes:

Автор: SABROG 12.3.2009, 0:38

Решил поэкспериментировать, а то ведь частичная прозрачность работает только с окнами с флагом Qt::FrameLessWindowHint, а у таких окон нет заголовка. Реализовал отрисовку станадртного titlebara, нажатие на клавишу заголовка, таскание за заголовок, размещение элементов управления на окне таким образом, чтобы они не перекрывали заголовок.


Автор: log1c 12.3.2009, 11:36

А если допустим имеется свое главное окно, унаслед-е от QMainWindow в нем в качестве centralWidget QGraphicsScene/View. Сделал свой виджет (пусть будет MyWidget(QWidget *parent) ). В главном окне создал экземпляр MyWidget, в качестве парента передал centralWidget. Так вот, можно ли как-то сделать такой же эффект для MyWidget с Qt::WA_TranslucentBackground как если бы этот виджет был бы без парента?

Автор: SABROG 12.3.2009, 12:16

Цитата(log1c @ 12.3.2009, 14:36) *
А если допустим имеется свое главное окно, унаслед-е от QMainWindow


Можно, но придется избавится от QMainWindow в пользу QWidget, соответственно и заголовок придется рисовать самому. И вместо центрального виджета использовать любой другой виджет с отключенным (false) autoFillBackground. В принципе если ты нарисуешь заголовок для главного окна, то для дочерних тоже будет не проблема. Но тут начинается геморрой с обработкой event'ов и надо хорошо разбираться как работают стили. Я вот сейчас не могу понять почему градиент на заголовке цветом - "синее" чем стандартный в винде, и почему не рисуется текст заголовка, хоть я его и прописываю.


Автор: kwisp 12.3.2009, 12:19

SABROG,
так просто в небо пальцем - посмотри цвет шрифта которым прописываешь. может он совпадаетс цветом фона заголовка.:)
почему решил что синее?? вроде такой же.

Автор: SABROG 12.3.2009, 12:24

Цитата(kwisp @ 12.3.2009, 12:19) *
SABROG,
так просто в небо пальцем - посмотри цвет шрифта которым прописываешь. может он совпадаетс цветом фона заголовка.:)
почему решил что синее?? вроде такой же.

Тыкал я пальцем, делал текст настолько длинным, чтобы он попадал уже на белую часть градиента. Не прокатило.
Ну может не синее, но явно отличается.
---
Кто-нибудь знает какие у голого QWidget'a флаги? Пришлось через qDebug() получить значение 134279169 и тупо сконвертить для оптиона:
o.titleBarFlags = static_cast<Qt::WindowType>(134279169);

Только после этого я добился этого. Но почему кнопка закрытия окна окантована понять не могу.

---
Какое-то у него странное поведение


Автор: SABROG 17.3.2009, 16:10

Красотаа :)



Понимание постепенно приходит...

Автор: log1c 17.3.2009, 16:15

8)
Прикольно!

Автор: SABROG 17.3.2009, 16:27

Естественно заголовок зависит от стиля. Я лишь в paintEvent'e отрисовываю доступные компоненты окна. Сам лично ничего не рисую, что радует.

Сегодня на основе QRubberBand удалось сделать стандартное поведение окна при перетаскивании за заголовок. Чтобы понять разницу достаточно сравнить стандартное окно и winamp. Если тащить за заголовок обычного окна, то оно остается висеть неподвижно, но появляется серая прозрачная рамка (QRubberBand), которая показывает новое положение окна. При отпускании - окно перемещается в это место. А если таскать винамп или окна, где реализована эмуляция перетаскивания, то окно перемещается сразу же вслед за мышкой. Это не есть гуд для производительности.

Также научился определять стандартными средствами на какие кнопки был сделан клик, где клик был отпущен, находится ли курсор мышки на этом элементе или на каком-то другом (hover). Научился управлять состояниями элементов - нажать/отпустить кнопку и т.д. Довольно интересно.

Автор: SABROG 17.3.2009, 21:04

Откопал исходники QGraphicsWidget. Посмотрев внутрь увидел, что все что я делал уже реализовано. Попутно понял какой объем еще не сделан. Обидно то, что нельзя этот QGraphicsWidget создать тупо как окно не на сцене, чего я и пытаюсь добиться. Когда начинаешь углубляться в технологию понимаешь, что каждый пиксель на экране выверен, нет ничего простого и каждая минимальная функциональность дается потом и кровью.

Автор: SABROG 21.3.2009, 13:16

Решил добавить фрейм окну и запутался. Стилизованные окна походу без фреймов работают:



Ну да, так и есть:

bool hasBorder = !style()->styleHint(QStyle::SH_TitleBar_NoBorder, &bar, widget);

Автор: Litkevich Yuriy 21.3.2009, 13:46

Цитата(SABROG @ 21.3.2009, 16:16) *
Стилизованные окна походу без фреймов работают:
чёто я не понял, что значит без фрэймов?

Автор: SABROG 21.3.2009, 14:55

Цитата(Litkevich Yuriy @ 21.3.2009, 13:46) *
Цитата(SABROG @ 21.3.2009, 16:16) *
Стилизованные окна походу без фреймов работают:
чёто я не понял, что значит без фрэймов?

Border имеется ввиду (рамка). Для виндового стиля она рисуется, а для кастом стилей их рисовать не надо, помимо этого там еще замут есть с регионами, когда заголовки полуокруглые.

Автор: posi4 19.5.2009, 14:25

Думаю здесь этот вопрос будет уместен!

Хотелось бы сделать такую вещь: при выборе пункта меню, допустим комбо-бокса,
затемнялся бы экран полупрозрачным черным(наподобие того как это реализовано в Picasa 3, да и по моему в большинстве браузеров),
ну и собственно там где нибудь вводилось значение в лайн-эдит, например!

Вопрос: может это уже реализовано каким нибудь виджетом или какой нибудь script есть? идея воплощения этого у меня присутствует, но не хотелось бы тратить время!

Автор: SABROG 19.5.2009, 15:05

Никогда не видел. Скрин можно?

Автор: Litkevich Yuriy 19.5.2009, 15:17

Цитата(SABROG @ 19.5.2009, 19:05) *
Никогда не видел. Скрин можно?
ходи сюда: http://www.crossplatform.ru/
И ткни на любой сриншот, любой программы

Автор: posi4 19.5.2009, 15:25

Цитата(Litkevich Yuriy @ 19.5.2009, 16:17) *
Цитата(SABROG @ 19.5.2009, 19:05) *
Никогда не видел. Скрин можно?
ходи сюда: http://www.crossplatform.ru/
И ткни на любой сриншот, любой программы


Да, именно этот эффект.

Автор: SABROG 19.5.2009, 16:16

Ну этот эффект я видел много раз, но совершенно не могу понять как он с combobox'ом будет выглядеть. И самое главное для каких целей такое делается. С картинками и модальными диалогами понятно, но с комбиком.

Автор: posi4 20.5.2009, 8:59

Ну хорошо, пускай это будет диалог или картинка, а не комбо. Суть по моему от этого не меняется,
кликнешь ты на картинку и будет вызываться эффект затемнения или он будет вызываться при выборе пункта в комбо-боксе.
Т.е. если кликается картинка она показывается на затемнённом фоне, а я хочу кликать на пункте комбика и у меня должен вызываться
лайн-эдит(или как было правильно сказано модальный диалог) для ввода числового значения этого пункта.
Цели здесь преследую чисто эстетические, с практической точки зрения это конечно вещь бесполезная.

Автор: syrok 22.7.2009, 23:35

Цитата(SABROG @ 21.3.2009, 13:16) *
Решил добавить фрейм окну и запутался. Стилизованные окна походу без фреймов работают:


Не сочтите за наглость, можно исходнички?

Автор: Litkevich Yuriy 23.7.2009, 6:33

Цитата(syrok @ 23.7.2009, 3:35) *
Не сочтите за наглость, можно исходнички?
ищи в теме.

Автор: syrok 24.7.2009, 1:16

Цитата(Litkevich Yuriy @ 23.7.2009, 6:33) *
ищи в теме.

Если бы я видел, я бы не попросил. Ткните меня плиз носом, я не вижу(((

Автор: Litkevich Yuriy 24.7.2009, 5:25

syrok, ну проси у SABROG'а или у него в http://vingrad.ru/blogs/sabrog/ может, что-то найдёшь

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)