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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как реализовать методами Qt виндовый ClipCursor?  (Прочитано 6669 раз)
mal
Гость
« : Март 21, 2007, 09:35 »

Доброе время суток.
Qt 4.2

Подскажите можно ли в Qt сделать "запирание" курсора в заданно
й области?
Если винда - то использую  апишный ClipCursor и все пучком.

#if defined(__WIN32__) || defined(WIN32)
#include <windows.h>
#include <winuser.h>
#endif
...
#if defined(__WIN32__) || defined(WIN32)
   RECT rect;
   rect.left = 100;
   rect.top = 100;
   rect.right  = 200;  
   rect.bottom = 200;
   ClipCursor(&rect);
#endif

Можно ли сделать то же самое используя методы Qt? Понятно, что при при переезде на другую платформу приведенный код не покатит.
Отслеживать курсор в mouseMoveEvent и принудительно задавать его позицию не предлагать, ибо такая схема не катит, если визуализируется одновременно несколько виджетов.
Есть идеи?
Записан
mal
Гость
« Ответ #1 : Апрель 11, 2007, 09:14 »

ну так что?: ни кто из присутствующих на форуме не смог присоветовать как реализовать такую простенькую задачу... Тролли тоже молчат - вопрос был задан и им. Неужто "Qt" не дает возможности найти решение по данному посту? (легко реализуемое в винде)
Повторяю: идеи есть? спецы - ау...
Записан
Вячеслав
Гость
« Ответ #2 : Апрель 11, 2007, 09:24 »

IMHO qt тут ваааще не при делах - ты пытаешься переопределить работу устройства ввода - вроде этим должна ось заниматься .....Но это мое мнение Подмигивающий
PS А винда автоматом область clip'а пересчитывает если главное окошко переехало ?
Записан
mal
Гость
« Ответ #3 : Апрель 11, 2007, 09:43 »

to Вячеслав
Если ты в винде сделал ClipCursor(&rect) - то курсор у тебя запирается внутри области которую ты задал. Как ты не пытаешься выйти мышой наружу из "запертой" области - у тебя это не получится, пока ты либо не изменишь ее, либо не восстановишь на ту область, которая была до твоего запирания. Ее ты предварительно узнаешь вызовом функции GetClipCursor.
Для чего это нужно? Например при отрисовке чего либо при нажатой левой кнопке мыши, или перемещении объекта, мне требуется сделать это внутри определенной мной части окна. Отслеживать координаты курсора и, например, принудительно возвращать его на лимитирующую позицию - плохо ибо возникают неприятные визуальные эффекты (курсор скачет). Прекращать отрисовку или перетаскивание объекта тоже плохо, ибо вернувшись внутрь нужной мне области  не в том месте где курсор ее покинул какие действия следует предпринять? Отрисовать линию к месту входа? Переместить курсор на то место где он был покинут? ХЗ короче как корректно тут поступить.
А вдруг юзер еще при выходе за границы окна отпустил левый кнопарь и чо то там поделал, а потом вернулся внутрь окна где он рисовал/таскал до этого. Принудительно просимулировать нажатие левого кнопаря и продолжить выполнение прерваной операции? А с какого места? вопщем замкнутый круг.

ИМХО проще ограничить перемещение курсора, но похоже так как мне этого хочется , это вещь невыполнимая :-(

 ЗЫ "переезжаю" один виндовый проект на Qt, потому и возник этот вопрос
Записан
ANM
Гость
« Ответ #4 : Апрель 11, 2007, 12:57 »

Цитата: "mal"

ИМХО проще ограничить перемещение курсора, но похоже так как мне этого хочется , это вещь невыполнимая :-(

 ЗЫ "переезжаю" один виндовый проект на Qt, потому и возник этот вопрос


Да, похоже такой функциональности в Qt нет. А жаль. Возможно это связано с тем что нет соответствующих функций в linux.
Ну а вам я советую сделать простейшую обертку для Win32 ClipCursor и использовать ее.
Записан
Alex03
Гость
« Ответ #5 : Апрель 11, 2007, 14:35 »

Цитата: "mal"

А вдруг юзер еще при выходе за границы окна отпустил левый кнопарь и чо то там поделал, а потом вернулся внутрь окна......

Сообщение об отпускании кнопки мыши придёт твоему окну независимо от того где она была отпущена, и по этому событию и надо действовать. ТАкже как и то что события о перемещении мыши тоже будут валиться твоему окну пока кнопка нажата.
Если кнопка не отпущена, и мышь приехала опять в твоё окно то ваще всё хокей.
Записан
mal
Гость
« Ответ #6 : Апрель 12, 2007, 09:08 »

Цитата: "Alex03"

Если кнопка не отпущена, и мышь приехала опять в твоё окно то ваще всё хокей.


Предположим выход за пределы нужной мне области произошел в точке 300,100. А мышь по приезду в мое окно и внутрь области "отсечения" имеет координаты   300,300. Предположим, что на момент "выезда" юзер рисовал линию. Ты предлагаешь в этом случае провести линию из точки 300,100 в точку 300,300?
Это не наш метод.
Тем более если предположить что область отсечения по x скажем слева 100, справа 300. А хитрый юзер вернул мышу в окно слева, например в точке  100,275. В этом случае мы поимеем линию через всю нашу кортинку.  
Такой хокей нам не нужен.
Записан
Alex03
Гость
« Ответ #7 : Апрель 13, 2007, 07:34 »

Всё проще. Нажал юзер мышь в координатах Х0,У0 и начал рисовать линию.
По маусМув в Х1,У1 убирается сталая и рисуется новая линия?
Т.е. при движении мыши идут от неё события, линия перерисовывается. Зашибись.
Допустим мыша выехала за пределы, но сообщения маусМув всё равно валятся в окно (ибо кнопка не отпущена). В обработке этих сообщений есть 2 варианта.
1. Тупо рисовать как и раньше, всё что не надо отсечётся.
2. Из координат старта и текущих вычислять точку пересечения с границей окна, и считать что мыша там.
По отпусканию кнопки тоже приходит соответствующее событие.

Если под линией имелось ввиду ломанная (кривая и проч.) с автоматическими выставлениями вершин на каждый маусМув, то тут тоже можно всё корректно обработать.

А вот ограничивать юзера в свободе перемещения мыши - ИМХО не есть гут.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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