x11 ограничение движений мыши

Я пытаюсь зафиксировать движения курсора мыши в левой половине экрана. У меня есть следующая настройка экрана:

С левой стороны находится окно Qt размером 1120x1080, с правой стороны окно GL размером 800x1080.

Я использую оконный менеджер Openbox под Ubuntu 12.10. Расположение окон остается фиксированным.

Мне нужно ограничить движение мыши окном Qt.


person Roman Grigoriev    schedule 15.11.2012    source источник
comment
Способ, которым видеоигры не дают указателю мыши покинуть окно, заключается в его деформации, то есть постоянном перемещении его обратно в центр. Я не думаю, что есть способ заставить X11 привязывать указатель мыши к определенной области для вас, вы должны перемещать его назад всякий раз, когда он уходит.   -  person Max E.    schedule 15.11.2012


Ответы (2)


Чтобы мышь оставалась в окне, включите движение мыши с помощью:

setMouseTracking(true);

и переопределить void QWidget::mouseMovement( QMouseEvent * event )

void TheWindow::mouseMoveEvent ( QMouseEvent * event )
{
    // get window size without frame
    QRect s = geometry();

    // get current cursor position
    int x = event->globalX();
    int y = event->globalY();

    bool reset = false;

    // Check cursor position relative to window
    if (event->x() < 0) 
    {
        x -= event->x();
        reset = true;
    }
    else if (event->x() >= s.width())
    {
       x += s.width() - event->x() - 1;
       reset = true;
    }

    if (event->y() < 0)
    {
        y -= event->y();
        reset = true; 
    }
    else if (event->y() >= s.height())
    {
        y += s.height() - event->y() - 1;
        reset = true;
    }

    // if reset needed move cursor  
    if (reset) QCursor::setPos(x,y);

}
person parkydr    schedule 06.06.2013
comment
Примечание: это решение не работает, когда приложение запускается через TeamViewer, Virtual Box (с включенной интеграцией мыши), Google Remote Desktop, RDP и подобное приложение. Реализация использует абсолютные координаты мыши, которые отправляются с хоста, и не предоставляет интерфейс для установки положения мыши с ведомого устройства по соображениям безопасности. - person Monah Tuk; 09.06.2017

это касается QGraphicsItem::itemChange(). Если у вас есть элемент, который вы хотите ограничить определенной областью, переопределите itemChange() для этого элемента и отслеживайте изменения QGraphicsItem::ItemPositionHasChanged, чтобы увидеть, хотят ли элементы быть размещенными за пределами интересующей вас области, и предотвратить это, вернув позицию из этой области. Например:

QVariant QGraphicsItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    switch (change) {
    case ItemPositionHasChanged:
        if(x() < -200 || y() < -200 || x() > 200 || y() > 200)
            setPos(0, 0);
        graph->itemMoved();
        break;
    default:
        break;
    };

    return QGraphicsItem::itemChange(change, value);
}
person Shihe Zhang    schedule 24.04.2015