На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> MouseMove event за пределами окна
    Как можно получать событие перемещения мыши если мышь перемещается за пределами окна(кнопка отпущена)?
    Заранее спасибо.
      если речь о Qt, то QWidget::grabMouse ()
        Цитата Radagast @
        QWidget::grabMouse ()

        Пробовал. Но захват идет полностью, как передавать событие назад в систему. А то не могу ничего нажать...
          Цитата
          Qt offers five levels at which events can be processed and filtered:

          1. We can reimplement a specific event handler.

          Reimplementing event handlers such as mousePressEvent(), keyPressEvent(), and paintEvent() is by far the most common way to process events. We have already seen many examples of this.

          2. We can reimplement QObject::event().

          By reimplementing the event() function, we can process events before they reach the specific event handlers. This approach is mostly needed to override the default meaning of the Tab key, as shown earlier (p. 168). This is also used to handle rare types of events for which no specific event handler exists (e.g., QEvent::HoverEnter). When we reimplement event(), we must call the base class's event() function for handling the cases we don't explicitly handle.

          3. We can install an event filter on a single QObject.

          Once an object has been registered using installEventFilter(), all the events for the target object are first sent to the monitoring object's eventFilter() function. If multiple event filters are installed on the same object, the filters are activated in turn, from the most recently installed back to the first installed.

          4. We can install an event filter on the QApplication object.

          Once an event filter has been registered for qApp (the unique QApplication object), every event for every object in the application is sent to the eventFilter() function before it is sent to any other event filter. This approach is mostly useful for debugging. It can also be used to handle mouse events sent to disabled widgets, which QApplication normally discards.

          5. We can subclass QApplication and reimplement notify().

          Qt calls QApplication::notify() to send out an event. Reimplementing this function is the only way to get all the events, before any event filters get the opportunity to look at them. Event filters are generally more useful, because there can be any number of concurrent event filters, but only one notify() function.

          Many event types, including mouse and key events, can be propagated. If the event has not been handled on the way to its target object or by the target object itself, the whole event processing process is repeated, but this time with the target object's parent as the new target. This continues, going from parent to parent, until either the event is handled or the top-level object is reached.


          имхо 3й или 4й вариант Вам подойдут
            хм... В винде, (и в линуксе, по-моему), для это цели ставится hook. Я не знаю, есть ли имплементация у Qt этого механизма
              по 4-му варианту сделал.
              В классе MainWindows
              ExpandedWrap disabled
                bool MainWindow::eventFilter(QObject *obj, QEvent *event)
                {
                    if (event->type() == QEvent::MouseMove) {
                        ui->label_3->setText(QString::number(event->type()));
                        ui->label->setText(QString::number(QCursor::pos().x()));
                        return true;
                    }
                    return QMainWindow::eventFilter(obj, event);
                }

              в конструкторе MainWindow добавил строку
              ExpandedWrap disabled
                qApp->installEventFilter(this);

              И все равно ловит евенты только если мышка над окном, если за пределами то не посылаются события...

              Добавлено
              и даже 5-й вариант не хватает передвижение мыши за пределами окна.

              Добавлено
              Цитата Hsilgos @
              хм... В винде, (и в линуксе, по-моему), для это цели ставится hook. Я не знаю, есть ли имплементация у Qt этого механизма

              В том то и проблема. Не охота писать два приложения. Хочется заюзать Qt. Но если не выйдет, то придется писать хук. сначала на Линукс потом на винду....
                Druss
                так Вам по всему экрану надо ловить? о_О
                тогда можно по таймеру опрашивать QCursor::pos ()
                потому что ось не будет присылать события приложению, если мышь за пределами главного окна
                я изначально подумал, что мыщь в пределах окна, но просто над др.виджетами.
                Сообщение отредактировано: Radagast -
                  Цитата Radagast @
                  так Вам по всему экрану надо ловить? о_О

                  именно так.
                  Цитата Radagast @
                  тогда можно по таймеру опрашивать QCursor::pos ()

                  в таком случае я не буду знать когда курсор уперся в край экрана но мышка движется. Потому что если использовать QWidget::grabMouse() то даже если курсор мышки у края экрана событие QEvent::MouseMove генерируется, и есть возможность отследить на сколько пикселей курсор "должен" был уйти за пределы экрана.
                  Цитата Radagast @
                  потому что ось не будет присылать события приложению, если мышь за пределами главного окна

                  Надеялся что в Qt есть возможность отловить глобальные события.

                  Всем спасибо за ответы. Буду "рыть" в сторону хуков и возможно x11EventFilter().
                    Рытье в сторону XGrabPointer не дал результат. Все так же как и с QWidget::grabMouse() получается. :(
                    А где можно почитать про аналоги хуков под линукс?
                      Порылся в доках X11 и нарыл метод XSendEvent. Думаю если "заграбить" мышь через XGrabPointer а потом в секции обработки MotionNotify передать событие через XSendEvent окну над которым находиться мышь то должно получиться. Приду домой - попробую.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0632 ]   [ 16 queries used ]   [ Generated: 25.04.24, 01:39 GMT ]