Qt限制鼠标移动范围
几个月前,我编写一个截图程序,这个截图程序有涂鸦功能,在我遇到了一个难题,那就是在涂鸦的时候如何才能让光标只在特定的区域内移动?
一开始我的想法是,设置setMouseTracking为true,然后重载
void QWidget::mouseMoveEvent(QMouseEvent * event)
函数,一旦鼠标移出窗口,我就用
QCursor::setPos (int x, int y)
把它移回来。
这样做,功能是达到了,但是效果不是很好,每次尝试着将鼠标移出区域的时候,鼠标箭头都会在区域的边缘不停地抖动。
最近接触了一些Windows编程,然后发现可以用Windows API来限制鼠标的区域,下面是一段简单的代码:
#include "mainwindow.h"
#include <QApplication>
#include <windows.h>
#include <windef.h>
int main ( int argc, char *argv [ ] )
{
QApplication a (argc, argv ) ;
MainWindow w ;
w. show ( ) ;
RECT mainWinRect ; //RECT在windef.h中被定义
mainWinRect. left = (LONG )w. geometry ( ). left ( ) ;
mainWinRect. right = (LONG )w. geometry ( ). right ( ) ;
mainWinRect. top = (LONG )w. geometry ( ). top ( ) ;
mainWinRect. bottom = (LONG )w. geometry ( ). bottom ( ) ;
ClipCursor ( &mainWinRect ) ; //这是Windows API
return a. exec ( ) ;
}
#include <QApplication>
#include <windows.h>
#include <windef.h>
int main ( int argc, char *argv [ ] )
{
QApplication a (argc, argv ) ;
MainWindow w ;
w. show ( ) ;
RECT mainWinRect ; //RECT在windef.h中被定义
mainWinRect. left = (LONG )w. geometry ( ). left ( ) ;
mainWinRect. right = (LONG )w. geometry ( ). right ( ) ;
mainWinRect. top = (LONG )w. geometry ( ). top ( ) ;
mainWinRect. bottom = (LONG )w. geometry ( ). bottom ( ) ;
ClipCursor ( &mainWinRect ) ; //这是Windows API
return a. exec ( ) ;
}
这样一来,鼠标就只能在mainWinRect的范围内移动了,你也可以根据自身的需求设定RECT的值。
鼠标是公共的资源,如果你想取消限制,那么可以调用
ClipCursor
(
NULL
)
来释放对鼠标的限制。
另外要注意的是:
①假如你要限制鼠标在xxWidget内,只能等xxWidget实例被构建之后才能限制鼠标范围。
②如果在鼠标受限的时候,用户按下了Windows键,那么当前的窗口失去鼠标,鼠标受限会被取消。