X11限制鼠标移动

4

我尝试将鼠标光标移动锁定在屏幕的左半边。我的屏幕设置如下:

左侧是一个大小为1120x1080的Qt窗口,右侧是一个大小为800x1080的GL窗口。

我在Ubuntu 12.10下使用Openbox窗口管理器。窗口布局保持不变。

我需要限制鼠标移动到Qt窗口中。


1
视频游戏防止鼠标指针离开窗口的方法是通过“warping”,即不断将其移回中心。我认为没有办法让X11为您剪切鼠标指针到特定区域,您必须在它离开时将其移回。 - Max E.
2个回答

0
为了让鼠标停留在窗口内,使用以下代码启用鼠标移动:
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);

}

注意:当应用程序通过TeamViewer、Virtual Box(启用鼠标集成)、Google远程桌面、RDP及类似应用程序运行时,此解决方案无效。实现使用从主机发送的绝对鼠标坐标,并且出于安全原因不提供从Slave设置鼠标位置的接口。 - Monah Tuk

0

这涉及到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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接