Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Июль 04, 2012, 15:16



Название: Запрет перемещения формы за определенные границы
Отправлено: merke от Июль 04, 2012, 15:16
Ребят, всем привет!

Есть очень интересный вопрос.

Имеется форма, нужно запретить чтобы при перетаскивании её нельзя было зайти за определенные границы, если такое случилось, то пусть курсор выходит за границы, но форма двигается только по вертикали или горизонтали, не выходя за заданные границы. Во как интересно) что то танцую с бубнами и всё ни как.

Переопередил QMouseEvent, QPressEvent, QReleaseEvent. В QMouserEvent смотрю, если форма выходить за границы, то снимаю определенный флаг и тут же идет проверка этого флага, если он выставлен, то разрешаю двигать форму, если не выставлен форма остается внутри виртуального прямоугольника=) Но когда я курсор мыши опять завожу в допустимые границы, перемещать далее не получается форму, только отпустить кнопку мыши и заново начать процесс перемещения формы.

Подскажите, может у кого уже есть что то готовое?

Буду очень рад помощи!


Название: Re: Запрет перемещения формы за определенные границы
Отправлено: Bepec от Июль 04, 2012, 16:58
Переопредели enterEvent и если флаг твой стоит, то начинай таскание формы.

Хотя посмотреть бы реализацию - я чтот не припомню таких проблем.


Название: Re: Запрет перемещения формы за определенные границы
Отправлено: merke от Июль 04, 2012, 16:59
о как, завтра обязательно попробую, отпишусь сюда о результате. Спасибо!


Название: Re: Запрет перемещения формы за определенные границы
Отправлено: Igors от Июль 04, 2012, 17:29
Здесь можно обойтись без флага, напр

Код
C++ (Qt)
QPoint mLocalPos;  // MousePressEvent - запомнили точку в локальных координатах диалога
..
void MyDialog::mouseMoveEvent( QMouseEvent * event )
{
..
// новые координаты левого верхнего угла
QPoint dst = pos() + event->pos() - MapToGlobal(mLocalPos);
 
// подсечка
dst.x = qMax(dst.x, 100);
...
// двигаем диалог
      move(dst);
}
 


Название: Re: Запрет перемещения формы за определенные границы
Отправлено: merke от Июль 04, 2012, 17:43
Огромное спасибо! У вас многому можно поучиться!

Вот что получилось:

 
Код:
 QPoint dst = pos() + event->pos() - this->last;

   //Левая вертикаль
   dst.setX(qMax(dst.x(), 850));
   //Верхняя горизонталь
   dst.setY(qMax(dst.y(), 100));

   //Правая вертикаль
   dst.setX(qMin(dst.x(), 1152));
   //Нижняя горизонталь
   dst.setY(qMin(dst.y(), 504));

   //Двигаем
   move(dst);


Название: Re: Запрет перемещения формы за определенные границы
Отправлено: Igors от Июль 04, 2012, 18:01
Если this->last в глобальных координатах, то привязка к нему теряется когда сработала отсечка. Держите last в локальных и переводите в глобальные для подсчета dst