Выделение области экрана |
Здравствуйте, гость ( Вход | Регистрация )
Выделение области экрана |
ernie |
24.11.2010, 19:32
Сообщение
#1
|
Участник Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: 1 |
Доброго времени суток,господа.
Возникла такая задача : Нужно делать выделение области экрана,т.е. затемняем экран и выделяем нужную нам область прозраным(в стиле выделения photoshop и т.д. , т.е прямоугольная область,по краям маркеры для растягивания её). Пока появилась только идея делать виджет на весь экран,а в нём делать другой(для выделения),но возможно есть способы лучше это сделать,заранее спасибо. |
|
|
Алексей1153 |
24.11.2010, 21:17
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Пока появилась только идея делать виджет на весь экран,а в нём делать другой(для выделения),но возможно есть 1) вариант попроще: отследить нажатие вниз кнопки мыши и запомнить координату начала. Далее отслеживать движение и рисовать полупрозрачный прямоугольник от начала до курсора. При отпускани кнопки запомнить второй угол рамки и стереть прямоугольник. Минус - нужно перерисовывать графику, по крайней мере под предыдущим положением прямоугольника (его тоже придётся запоминать) Полупрозрачный прямоугольник можно нарисовать так:
2) вариант посложнее: делать полупрозрачный виджет, который будет менять размеры как рамка (то есть, сначала это точка, а потом растягивается за курсором в прямоугольник). Плюсы - не нужно думать про перерисовку на виджета снизу при движении. Сообщение отредактировал Алексей1153 - 24.11.2010, 21:19 |
|
|
BRE |
24.11.2010, 21:22
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
2 ernie
Посмотри на класс QRubberBand. |
|
|
ufna |
25.11.2010, 2:11
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 362 Регистрация: 24.5.2008 Из: Курган/СПб Пользователь №: 182 Спасибо сказали: 29 раз(а) Репутация: 5 |
Самый простой вариант - виджет белого цвета с альфа-каналом фона в 1 на весь раб. стол. Ловит в себе нужные события мыши и отрисовывает выделение на самом себе как душе угодно.
|
|
|
Алексей1153 |
25.11.2010, 8:15
Сообщение
#5
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
ufna, непонятно, как это будет происходить... Пусть виджет на весь экран. Если он полностью прозрачный, то сообщения мыши он не получит. Если прозрачность почти максимальна (так что виджет практически не видно для глаза), то сообщения придут, но все нижлежащие виджеты сообщений не получат. Что имелось в виду ?
|
|
|
ernie |
25.11.2010, 9:06
Сообщение
#6
|
Участник Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: 1 |
Алексей1153, а если сделать таким образом - делаем снимок экрана (grabWindow),далее создаём 2 image с этим снимком,1 - затемняем,2 - оставляем как есть,и далее,при выделении отрисовываем поверх затенённого изображения область из незатенённого равную выделенной?
|
|
|
igor_bogomolov |
25.11.2010, 9:35
Сообщение
#7
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Если он полностью прозрачный, то сообщения мыши он не получит. Это почему? Как связана прозрачность (альфа канал) с событиями Qt? но все нижлежащие виджеты сообщений не получат так нет никаких низлежащих виджетов.ernie, делайте как подсказал ufna. Да и за примерами далеко ходить не надо, посмотрите как работает тот же KSnaphot, там всё в точности как вы хотите |
|
|
ernie |
25.11.2010, 9:50
Сообщение
#8
|
Участник Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: 1 |
igor_bogomolov, хорошо,обязательно погляжу kSnapshot,спасибо
|
|
|
Алексей1153 |
25.11.2010, 10:29
Сообщение
#9
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Как связана прозрачность (альфа канал) с событиями Qt у меня, когда пиксел полностью прозрачен, сообщения от щелчка мыши в виджет не приходят, но приходят в виджет, который находится на z-уровень глубже. А у тебя по другому ? Вроде я ничего не путаю. Прям сейчас попробовать не могу. |
|
|
igor_bogomolov |
25.11.2010, 10:42
Сообщение
#10
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
у меня, когда пиксел полностью прозрачен, сообщения от щелчка мыши в виджет не приходят, но приходят в виджет, который находится на z-уровень глубже. А у тебя по другому ? Вроде я ничего не путаю. Прям сейчас попробовать не могу. Специально не проверял, не нужно как то было, но по документации такого быть не должно. Для того что бы виджет стал прозрачным к событиям мыши, необходимо выставить атрибут setAttribute(Qt::WA_TransparentForMouseEvents); Цитата(assistant) Qt::WA_TransparentForMouseEvents
When enabled, this attribute disables the delivery of mouse events to the widget and its children. Mouse events are delivered to other widgets as if the widget and its children were not present in the widget hierarchy; mouse clicks and other events effectively "pass through" them. This attribute is disabled by default. |
|
|
Текстовая версия | Сейчас: 1.12.2024, 23:03 |