Russian Qt Forum

Qt => Общие вопросы => Тема начата: gil9red от Июнь 26, 2015, 09:39



Название: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: gil9red от Июнь 26, 2015, 09:39
На окошке рисуется прямоугольник, который можно перемещать мышкой.
Перемещение может быть: свободным и с привязкой к сетке

Вот с привязкой к сетке у меня фигня выходит -- прямоугольник прикрепляется, но после начала движения прямоугольник тянется не за ту точку, в которую мы тыкнули на нем, а примерно верхний левый угол. Это особенно заметно, когда за нижний правый угол его хватает, перемещаешь, и он притягивается к курсору в верхнему правому углу, а после привязывается к ближайшей стороне ячейки сетки

Как сделать, чтобы работало хорошо? :)

При свободном перемещении такого нету

Алгоритм перемещения прямоугольника по форме:
Код
C++ (Qt)
   void mouseMoveEvent(QMouseEvent * e) {
       if (press) {
           QPointF delta = e->posF() - lastPos;
           rect.moveTo(rect.topLeft() + delta);
 
           // Если включена привязка
           if (snap.isChecked()) {
               QPointF pos = e->posF();
               double x = pos.x();
               double y = pos.y();
               x -= int(x) % cellSize.width();
               y -= int(y) % cellSize.height();
 
               pos = QPointF(x, y);
               rect.moveTo(pos);
               pos -= QPointF(x, y) - rect.topLeft();
               rect.moveTo(pos);
           }
       }
 
       lastPos = e->posF();
       update();
   }
 

Минимально-компилябельный пример приложен


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: Igors от Июнь 26, 2015, 09:55
Не проверял, но по-моему правильно иак
Код
C++ (Qt)
if (snap.isChecked()) {
 int w = cellSize.width();
 int h = cellSize.height();
 rect.moveTo(rect.left() / w * w, rect.top() / h * h);
}
И вообще, давно пора решать задачи посложнее  :)


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: gil9red от Июнь 26, 2015, 09:57
Не проверял, но по-моему правильно иак
Код
C++ (Qt)
if (snap.isChecked()) {
 int w = cellSize.width();
 int h = cellSize.height();
 rect.moveTo(rect.left() / w * w, rect.top() / h * h);
}
И вообще, давно пора решать задачи посложнее  :)

не работает :)


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: __Heaven__ от Июнь 26, 2015, 10:15
К сожалению, нет времени на попытки поиграть с этой задачей.
Имхо, lastPos нужно сохранять при клике. При смене позиции рамки перезаписывать lastPos. Только это заметил.


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: gil9red от Июнь 26, 2015, 10:21
К сожалению, нет времени на попытки поиграть с этой задачей.
Имхо, lastPos нужно сохранять при клике. При смене позиции рамки перезаписывать lastPos. Только это заметил.

Точно! Вы правы :)


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: Igors от Июнь 26, 2015, 12:47
Народная примета: исходная точка (с которой начался драг) должна храниться неизменной, иначе драг "уползет". Ладно, "побалуемся плюшками"  :) (аттач) Пришлось заменить posF на localPos (версия новее)





Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: gil9red от Июнь 26, 2015, 12:59
Народная примета: исходная точка (с которой начался драг) должна храниться неизменной, иначе драг "уползет". Ладно, "побалуемся плюшками"  :) (аттач) Пришлось заменить posF на localPos (версия новее)





О, спасибо! Заработало :)


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: __Heaven__ от Июнь 26, 2015, 13:34
Кстати, я не понял, зачем использовать float... Координаты экрана, ведь, в int. И там, где вы x и y высчитываете, они тоже должны быть int, имхо.


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: gil9red от Июнь 26, 2015, 13:39
Кстати, я не понял, зачем использовать float... Координаты экрана, ведь, в int. И там, где вы x и y высчитываете, они тоже должны быть int, имхо.

По условию задачи  :)


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: Igors от Июнь 26, 2015, 13:45
. Координаты экрана, ведь, в int
Уже нет, во всяком случае - не везде. (Получил за это когда переходил на какаву)


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: __Heaven__ от Июнь 26, 2015, 14:08
Опа. А где они во float?


Название: Re: Перемещение и привязка прямоугольника на форме (QWidget)
Отправлено: Igors от Июнь 26, 2015, 14:32
Опа. А где они во float?
Ну хотя бы в QMouseEvent. Напр предположение что QCursor::pos() возвращает то же самое значение что и в QMouseEvent (до тех пока мышь не передвинулась) оказалось неверным т.к. Mac OSX выдает флоты которые округляются по-разному.