Russian Qt Forum

Qt => Общие вопросы => Тема начата: mal от Март 21, 2007, 09:35



Название: как реализовать методами Qt виндовый ClipCursor?
Отправлено: 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 и принудительно задавать его позицию не предлагать, ибо такая схема не катит, если визуализируется одновременно несколько виджетов.
Есть идеи?


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


Название: как реализовать методами Qt виндовый ClipCursor?
Отправлено: Вячеслав от Апрель 11, 2007, 09:24
IMHO qt тут ваааще не при делах - ты пытаешься переопределить работу устройства ввода - вроде этим должна ось заниматься .....Но это мое мнение ;)
PS А винда автоматом область clip'а пересчитывает если главное окошко переехало ?


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

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

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


Название: как реализовать методами Qt виндовый ClipCursor?
Отправлено: ANM от Апрель 11, 2007, 12:57
Цитата: "mal"

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

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


Да, похоже такой функциональности в Qt нет. А жаль. Возможно это связано с тем что нет соответствующих функций в linux.
Ну а вам я советую сделать простейшую обертку для Win32 ClipCursor и использовать ее.


Название: как реализовать методами Qt виндовый ClipCursor?
Отправлено: Alex03 от Апрель 11, 2007, 14:35
Цитата: "mal"

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

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


Название: как реализовать методами Qt виндовый ClipCursor?
Отправлено: mal от Апрель 12, 2007, 09:08
Цитата: "Alex03"

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


Предположим выход за пределы нужной мне области произошел в точке 300,100. А мышь по приезду в мое окно и внутрь области "отсечения" имеет координаты   300,300. Предположим, что на момент "выезда" юзер рисовал линию. Ты предлагаешь в этом случае провести линию из точки 300,100 в точку 300,300?
Это не наш метод.
Тем более если предположить что область отсечения по x скажем слева 100, справа 300. А хитрый юзер вернул мышу в окно слева, например в точке  100,275. В этом случае мы поимеем линию через всю нашу кортинку.  
Такой хокей нам не нужен.


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

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

А вот ограничивать юзера в свободе перемещения мыши - ИМХО не есть гут.