我尝试将鼠标光标移动锁定在屏幕的左半边。我的屏幕设置如下:
左侧是一个大小为1120x1080的Qt窗口,右侧是一个大小为800x1080的GL窗口。
我在Ubuntu 12.10下使用Openbox窗口管理器。窗口布局保持不变。
我需要限制鼠标移动到Qt窗口中。
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);
}
这涉及到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);
}