Russian Qt Forum
Май 21, 2024, 06:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запрет перемещения формы за определенные границы  (Прочитано 3497 раз)
merke
Гость
« : Июль 04, 2012, 15:16 »

Ребят, всем привет!

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

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

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

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

Буду очень рад помощи!
Записан
Bepec
Гость
« Ответ #1 : Июль 04, 2012, 16:58 »

Переопредели enterEvent и если флаг твой стоит, то начинай таскание формы.

Хотя посмотреть бы реализацию - я чтот не припомню таких проблем.
Записан
merke
Гость
« Ответ #2 : Июль 04, 2012, 16:59 »

о как, завтра обязательно попробую, отпишусь сюда о результате. Спасибо!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 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);
}
 
Записан
merke
Гость
« Ответ #4 : Июль 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);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 04, 2012, 18:01 »

Если this->last в глобальных координатах, то привязка к нему теряется когда сработала отсечка. Держите last в локальных и переводите в глобальные для подсчета dst
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 23.