crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QGraphicsScene, передвижения элементов.
Phoenix_nsk
  опции профиля:
сообщение 5.5.2011, 19:31
Сообщение #1


Студент
*

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

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




Репутация:   0  


Есть сцена, на ней есть элементы, некоторые двигать можно, некоторые нет, которые можно двигать - нужно ограничить в области их передвижения.

Как это лучше реализовать?

Как вообще контролировать передвижение элементов на сцене?

Я переопределил метод из QGraphicsView, в тестовом варианте это выглядит так:
void SetModelView::mouseMoveEvent(QMouseEvent *event)
{
    QGraphicsItem *temp = this->itemAt(event->pos());
    if (temp)
        temp->setPos(this->mapToScene(event->pos()));
}


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

Сообщение отредактировал Phoenix_nsk - 6.5.2011, 19:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.5.2011, 7:09
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Phoenix_nsk @ 5.5.2011, 22:31) *
Я переопределил метод из QGraphicsScene
Цитата(Phoenix_nsk @ 5.5.2011, 22:31) *
void SetModelView::
пишешь что метод сцены переопределил, а название класса содержит "Представление"
Цитата(Phoenix_nsk @ 5.5.2011, 22:31) *
В итоге приложение вылетает Segmentation fault
логично, ведь ты не проверяешь есть ли вообще элемент в данных координатах itemAt(event->pos()). А сразу вызываешь метод.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 6.5.2011, 19:27
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 6.5.2011, 8:09) *
Цитата(Phoenix_nsk @ 5.5.2011, 22:31) *
Я переопределил метод из QGraphicsScene
Цитата(Phoenix_nsk @ 5.5.2011, 22:31) *
void SetModelView::
пишешь что метод сцены переопределил, а название класса содержит "Представление"
Цитата(Phoenix_nsk @ 5.5.2011, 22:31) *
В итоге приложение вылетает Segmentation fault
логично, ведь ты не проверяешь есть ли вообще элемент в данных координатах itemAt(event->pos()). А сразу вызываешь метод.

Поправил замечания.
Да меня уже конкретно клинит на этом. Из-за того что не могу сделать адекватные передвижения элементов - не могу двигаться дальше. :( :unsure: :help:

Как лучше подойти к вопросу передвижения элементов?
Там ещё преобразовывать систему координат надо, что-то она тоже не работает у меня как надо. Я в печали. =(((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 6.5.2011, 20:22
Сообщение #4


Студент
*

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

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




Репутация:   0  


Размер сцены взят из размеров виджета, его размеры не изменяются.
Вывод сцены происходит на этот же самый виджет, получаетсякак-то так:

scene = new QGraphicsScene(QRect(0, 0, width(), height()), this); // поле для элементов
view = new SetModelView(elems, scene, this); // для просмотра поля
view->setFixedSize(width(), height());


Дальше добавляются элементы на сцену.
После чего начинается просмотр сцены.

Движения элементов на сцене реализованы так:

void SetModelView::mouseMoveEvent ( QMouseEvent * event )
{
    if (dragItem) {
            tempItem->cargo->setPos(this->mapToScene(event->pos()));
    }
}

void SetModelView::mousePressEvent(QMouseEvent *event)
{
    QGraphicsItem *temp = this->itemAt(event->pos());

    foreach(OneItem *item, elems)
        if (static_cast<QGraphicsItem*>(item->cargo) == temp) {
            tempItem = item;
            dragItem = true;
            break;
        }
}

void SetModelView::mouseReleaseEvent(QMouseEvent *event)
{
    dragItem = false;
    tempItem = 0;
}


Движение происходит, но элементы сильны сдвинуты относительно положения курсора вниз и вправо.
Неправильно идёт преобразование координат.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 7.5.2011, 16:29
Сообщение #5


Студент
*

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

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




Репутация:   0  


Да чё такое то, народ?
Тема сложная или чё; просмотры есть, ответов/советов - НЕТ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 7.5.2011, 18:12
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


тема.. как бэ элементарная, уже на все ответили

тебе передвижение надо ограничить? Дак ограничь. Зачем ты его сразу двигаешь? Точка у тебя есть "куда пользователь мышь увел", прямоугольники, которым ограничиваешь - тоже должен быть. Теперь найди близжайшую точку, лежащую на этом прямоугольнике, и двигай его туда. Это будет шаг 1. Когда его сделаешь, пиши, подскажу как ограничить весь элемент, а не его pivot point.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 7.5.2011, 18:28
Сообщение #7


Студент
*

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

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




Репутация:   0  


На самое главное не ответили - координаты которые получаются от мыши не соответствуют координатам на сцене, элемент тащится вдалеке от указателя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 7.5.2011, 18:53
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


а зачем по View то ловишь? Лови в самом айтеме или мапай его не к сцене, а к вью.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 7.5.2011, 19:08
Сообщение #9


Студент
*

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

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




Репутация:   0  


Можно примеры?
Реально, уже второй раз с преобразованиями системы координат и второй раз проколы, ни один из описанных в документации методов (map***) адекватно не работает.

Если я выложу весь проект, то сможете подсказать что конкретно туда вписать?

Сообщение отредактировал Phoenix_nsk - 7.5.2011, 19:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 7.5.2011, 19:13
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Выкладывайте, посмотрим.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.12.2024, 16:46