crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Выделение области экрана
ernie
  опции профиля:
сообщение 24.11.2010, 19:32
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


Доброго времени суток,господа.
Возникла такая задача :
Нужно делать выделение области экрана,т.е. затемняем экран и выделяем нужную нам область прозраным(в стиле выделения photoshop и т.д. , т.е прямоугольная область,по краям маркеры для растягивания её).
Пока появилась только идея делать виджет на весь экран,а в нём делать другой(для выделения),но возможно есть способы лучше это сделать,заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.11.2010, 21:17
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(ernie @ 24.11.2010, 21:32) *
Пока появилась только идея делать виджет на весь экран,а в нём делать другой(для выделения),но возможно есть


1) вариант попроще: отследить нажатие вниз кнопки мыши и запомнить координату начала. Далее отслеживать движение и рисовать полупрозрачный прямоугольник от начала до курсора. При отпускани кнопки запомнить второй угол рамки и стереть прямоугольник. Минус - нужно перерисовывать графику, по крайней мере под предыдущим положением прямоугольника (его тоже придётся запоминать)
Полупрозрачный прямоугольник можно нарисовать так:

paintEvent()
{
   QPainter P(this);

   //рисуется как обычно графика
   //...

   //прозрачный прямоугольник
   P.setOpacity(.5);
   P.fillRect()
   //   P.setOpacity(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


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 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  


Цитата(Алексей1153 @ 25.11.2010, 8:15) *
Если он полностью прозрачный, то сообщения мыши он не получит.
Это почему? Как связана прозрачность (альфа канал) с событиями Qt?
Цитата(Алексей1153 @ 25.11.2010, 8:15) *
но все нижлежащие виджеты сообщений не получат
так нет никаких низлежащих виджетов.

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


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(igor_bogomolov @ 25.11.2010, 11:35) *
Как связана прозрачность (альфа канал) с событиями Qt

у меня, когда пиксел полностью прозрачен, сообщения от щелчка мыши в виджет не приходят, но приходят в виджет, который находится на z-уровень глубже. А у тебя по другому ? Вроде я ничего не путаю. Прям сейчас попробовать не могу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 25.11.2010, 10:42
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Алексей1153 @ 25.11.2010, 10: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.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 0:23