crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QGraphicsItem отрисовка по нажатию кнопки вопрос...
AntonTatu
  опции профиля:
сообщение 27.11.2008, 12:37
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

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




Репутация:   0  


Всем привет.!!! Вопрос такой:

Создаю собственный класс унаследованный от QGraphicsItem, определяю в нем методы:
MyItem::boundingRect(); MyItem::painter (рисую круг), MyItem::mousePressEvent, MyItem::mouseMoveEvent, MyItem::mouseReleaseEvent, разрешаю перетаскивать MyItem мышкой (setFlag(ItemIsMovable);

Создаю собственный класс унаследованный от QGraphicsView, определяю в нем метод:
MyView::mousePressEvent

определяю сцену....


При нажатии кнопки мышки срабытывает MyView::mousePressEvent и отрисовывает в точке соответствующего положения мышки кружочек, (при этом созданный Item записываю в список) можно их нарисовать много и перетаскивать, только понять не могу как сделать так что бы нельзя было рисовать в месте в котором уже кружок нарисован ?, т.е. не допустить наложения двух кружочков на сцене..

Пробовал в методе MyView::mousePressEvent сравнивать текущее положение мышки с положениями Item-ов записанными в список и в зависимости от этого рисовать или не рисовать новый, но к сожалению это не хороший путь в сохраненную точку невозможно попасть....

ЗЫ: прочитал свой вопрос.....:) если понять что же я хочу трудно, скажите попробую переформулировать...
ЗЫЫ: перерыл всю возможную литературу, ответа не нашел но есть же способ мне бы малинький примерчик.....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.11.2008, 14:56
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3290
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Если я тебя правильно понял, то тебе нужно поиграться с регионами, на наличие пересечений...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 27.11.2008, 15:10
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

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




Репутация:   0  


мне нужно каким то образом делать вот что:

при нажатии на кнопку мышки определять что я нажал не на пустое поле а на кружок, и не рисовать рядом новый, соответственно при нажатии на пустое поле нарисовать кружок...., как рисовать я знаю, как определить что под мышкой находится кружок ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.11.2008, 15:31
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3290
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Тебе в памяти нужно будет держать регионы, или приводить к ним, а затем при клике получив точку клика проверять попал ты в регион или нет, это можно сделать с помощью: bool QRegion::contains ( const QPoint & p ) const.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 27.11.2008, 15:38
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

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




Репутация:   0  


Цитата(ViGOur @ 27.11.2008, 15:31) *
Тебе в памяти нужно будет держать регионы, или приводить к ним, а затем при клике получив точку клика проверять попал ты в регион или нет, это можно сделать с помощью: bool QRegion::contains ( const QPoint & p ) const.


а небольшой примерчик можно, в принципе как я уже сказал все выведенные на сцену итымы я засовываю в список, и могу получать их координаты, подозреваю что и регионы там тоже хранятся, как проверять попал я в регион или нет ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.11.2008, 16:45
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3290
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Ну например:
// QList<QRect> rectList, список окружностей
// QRect rect, координаты окружности
bool bEx=false;
foreach( rect, rectList)
{
   QRegion region( rect, QRegion::Ellipse);
   if( region.contains( point))  // QPoint point, координаты мышки
   {
        // мы попали в окружность
        bEx = true;
        break;
   }
}

if( !bEx)
{
   // Рисуем окружность и прочее
}
надеюсь идея понятна...

Сообщение отредактировал ViGOur - 27.11.2008, 16:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 28.11.2008, 1:18
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

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




Репутация:   0  


Цитата
надеюсь идея понятна...


идея совершенно неправильная как оказалось... вот что написано у Макса Шлее:

"Класс QGraphicsitem предоставляет возможность определения столкновений
элементов. Это задача выполняется с помощью методов QGraphics:: shape
и QGraphicsitem:: collideswith Если вы создаете свой класс элемента, то
для определения столкновенЂий необходимо будет перезаписать метод
QGraphicsitem:: shape. Этот метод должен возвращать форму элемента в
локальных координатах. Благодаря этому класс QGraphicsitem будет
самостоятельно производить распознавание столкновений.
"

неужели никто не сталкивался с такой проблемой !!! очень нужно.... долго уже мучаюсь...... маленький примерчик плиииз.....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 28.11.2008, 11:01
Сообщение #8


Мастер
******

Группа: Модератор
Сообщений: 3290
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


а вот с этим уже играться нужно и читать, я пока не заморачивался...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Yaroslav
  опции профиля:
сообщение 28.2.2011, 16:35
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 15.2.2011
Пользователь №: 2412

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




Репутация:   0  


Если уже было решение этой проблемы пожалуйста напишите..
У меня появился вариант решения этой проблемы через mouseHover, только не знаю или он правельный...(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 21.9.2019, 6:36