Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QGraphicsItem отрисовка по нажатию кнопки вопрос...
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
AntonTatu
Всем привет.!!! Вопрос такой:

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

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

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


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

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

ЗЫ: прочитал свой вопрос.....:) если понять что же я хочу трудно, скажите попробую переформулировать...
ЗЫЫ: перерыл всю возможную литературу, ответа не нашел но есть же способ мне бы малинький примерчик.....
ViGOur
Если я тебя правильно понял, то тебе нужно поиграться с регионами, на наличие пересечений...
AntonTatu
мне нужно каким то образом делать вот что:

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


а небольшой примерчик можно, в принципе как я уже сказал все выведенные на сцену итымы я засовываю в список, и могу получать их координаты, подозреваю что и регионы там тоже хранятся, как проверять попал я в регион или нет ?
ViGOur
Ну например:
// 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)
{
   // Рисуем окружность и прочее
}
надеюсь идея понятна...
AntonTatu
Цитата
надеюсь идея понятна...


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

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

неужели никто не сталкивался с такой проблемой !!! очень нужно.... долго уже мучаюсь...... маленький примерчик плиииз.....
ViGOur
а вот с этим уже играться нужно и читать, я пока не заморачивался...
Yaroslav
Если уже было решение этой проблемы пожалуйста напишите..
У меня появился вариант решения этой проблемы через mouseHover, только не знаю или он правельный...(
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.