Заблокирован
1

Определение объекта под курсором

24.08.2014, 21:40. Показов 4025. Ответов 10
Метки нет (Все метки)

Ну вопрос в сабжекте, то есть есть класс - наследник QGraphicsItem, в общем он является как бы элементом картинкой, собственно как и что переопределить, чтоб можно было бы при выборе этого элемента мышкой провести дополнительную попиксельную проверку, чтоб определить, попали ли мышка именно по картинке или попала в обалсть прозрачных цветов (ну или белых каких - то) и в таком случае, надо дать отбой системе, мол мышка не попала по элементу - отбой !
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2014, 21:40
Ответы с готовыми решениями:

GraphicsItem под курсором
Всем привет. Подскажите пожалуйста, как определить, находится GraphicsItem под курсором или нет?...

Позиция полигона под курсором
Приветствую всех. Дамы и господа, подскажите пожалуйста. Есть ли у Qgraphicspolygonitem какая либо...

Выделение текста под курсором в QWebView
У меня есть QWebView объект, я устанавливаю туда html-ну. при клике правой кнопкой мыши я показываю...

Подсветка строки под курсором в qTableView
Есть виджет наследуемый от qTableView с переопределенными интерфейсами drag and drop(вместо ячейки...

10
Поклонник Qt
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
25.08.2014, 00:40 2
del

Добавлено через 30 минут
QGraphicsItem - лишь каркас для будущего графического объекта.
Т.е. если итем является изображением, то размеры и другие параметры вы обязаны заранее объявить в классе.
В данном случае, вам необходимо заранее добавить специфический функционал связанный с изображением (получение цвета пикселя по позиции), и применять оный в реализации QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event);
Если я правильно понял вопрос.
1
Заблокирован
25.08.2014, 08:58  [ТС] 3
Цитата Сообщение от CriDos Посмотреть сообщение
рименять оный в реализации QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event);
А как системе Qt дать отбой на выбор элемента, если мышкой попал в прозрачный цвет допустим (ну это я сам проверю), как сделать, чтоб нельзя было бы, например, таскать элемент, если тыкаешь мышкой как бы мимо картинки (ну допусти картинка - звезда, мышкой ткнул между зубцов) и значит таскать элемент по экрану нельзя...
Может куда то false вернуть или что ?
0
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
25.08.2014, 12:30 4
Вероятно вы используете QGraphicScene, где есть метод:
C++
1
QGraphicsItem * QGraphicsScene::itemAt(const QPointF & position, const QTransform & deviceTransform) const
который возвратит указаль на итем в указанных координатах, которые можно взять от мыши, дальше просто сравнить полученный итем с вашим.
1
Заблокирован
25.08.2014, 12:36  [ТС] 5
Цитата Сообщение от Asting Посмотреть сообщение
который возвратит указаль на итем в указанных координатах, которые можно взять от мыши, дальше просто сравнить полученный итем с вашим.
Но у QGrapshicsVew есть фишка автоматического драг энд дропа, то есть мышкой можно двигать айтимы по экрану, вот как запретить двигать айтим, если выбор прошёл не по самой картинки внутри прямоугольной области айтима ?
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.08.2014, 12:39 6
Создаете класс наследник от QGraphicsItem.
В нем переопределяете необходимые методы для обработки событий мыши.
QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
При срабатывании события, получаем координаты мыши.
Ну а далее уже зависит от содержимого графического элемента.
Если это просто картинка, то всегда можно получить значение пикселя по координатам, откуда в свою очередь можно получить значение альфа-канала. Если попали в прозрачный пиксель (или пиксель цвета фона), то ничего не делаем. Если попали в непрозрачный пиксель (или отличный от цвета фона), то отправляем какой-то сигнал, сообщающий о том, что курсор попал в картинку. Важное замечание, чтобы это работало, размер графикс айтема должен совпадать с размером картинки, иначе будут трудности с определением кординаты нужного пикселя.
0
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
25.08.2014, 12:40 7
-NEURON-, ну так область айтема не обязательно должна быть прямоугольной:
QGraphicsEllipseItem
QGraphicsLineItem
QGraphicsPolygonItem
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.08.2014, 12:43 8
Цитата Сообщение от Asting Посмотреть сообщение
-NEURON-, ну так область айтема не обязательно должна быть прямоугольной:
QGraphicsEllipseItem
QGraphicsLineItem
QGraphicsPolygonItem
Хе-хе! При этом айтем все равно будет создан как прямоугольник с вписанным в него эллипсом, линией или полигоном.
2
Заблокирован
25.08.2014, 13:20  [ТС] 9
Ну не будешь же ты контур картинки микимауса описывать полигоном
QGraphicsView при щелчке мыши может сказать, что ты попал по прямоугольной области какого - то айтима, а вот дальше то и идёт мой вопрос: как, проверив выбранную прямоугольную область на попадание именно в нужные пиксели (допустим во все - не белые), сказать Qt, чтоб он думал, что не попал по айтиму (ну а как следствие - нельзя было бы в таком случае тащить айтим мышкой)
0
Поклонник Qt
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
25.08.2014, 17:37 10
Лучший ответ Сообщение было отмечено -NEURON- как решение

Решение

Цитата Сообщение от -NEURON- Посмотреть сообщение
Но у QGrapshicsVew есть фишка автоматического драг энд дропа, то есть мышкой можно двигать айтимы по экрану, вот как запретить двигать айтим, если выбор прошёл не по самой картинки внутри прямоугольной области айтима ?
Для этого можно выставить необходимые флаги Item'у: http://qt-project.org/doc/qt-5... mFlag-enum

C++ (Qt)
1
setFlag(ItemIsMovable, false);
Добавлено через 19 минут
Цитата Сообщение от -NEURON- Посмотреть сообщение
как, проверив выбранную прямоугольную область на попадание именно в нужные пиксели (допустим во все - не белые), сказать Qt, чтоб он думал, что не попал по айтиму (ну а как следствие - нельзя было бы в таком случае тащить айтим мышкой)
Абстрактный код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
void QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if( getPixel( event->pos() ) == QColor::black() )
    {
        setFlag(ItemIsMovable, false);
    }
    else
    {
        setFlag(ItemIsMovable, true);
        QGraphicsItem::mousePressEvent(event);
    }
}
Соответственно, необходимо так-же переопределить mouseReleaseEvent(QGraphicsSceneMouseEvent *event) с необходимой реализацией.
Ну и конечно, реализовать функцию-член getPixel для производного класса QGraphicsItem.
Как то так.
1
Заблокирован
25.08.2014, 17:50  [ТС] 11
Всё понял, спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2014, 17:50

Определение цвета пикселя под курсором
здравствуйте, вот так вот я получаю цвет пикселя под курсором int x = Mouse->CursorPos.x; int y...

Создание объекта на экране под курсором
Доброго времени суток. Подскажите пожалуйста с моей тупостью, никак не доходит. Нужно создать...

Получить имя объекта под курсором
Ребята как получить имя контрола на который направлена мышка или нажат пальцем?

Глобальное определение бордера под курсором UI Automation
Всем доброго времени суток! Пытаюсь определить находится ли курсор мыши над бордером какого либо...

Определение цвета пикселя под курсором и контроль RGB ленты на Arduino
Доброго времени суток уважаемые форумчане! Как получить цвет пикселя под курсором на экране при...

Движение объекта за курсором
Нужно сделать движение объекта за курсором. Но движение объекта должно быть плавное и на маленькой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru