Qt限制鼠标移动范围

Qt限制鼠标移动范围

更多
GUI  C++  C/C++  QT

几个月前,我编写一个截图程序,这个截图程序有涂鸦功能,在我遇到了一个难题,那就是在涂鸦的时候如何才能让光标只在特定的区域内移动?

一开始我的想法是,设置setMouseTracking为true,然后重载

void QWidget::mouseMoveEvent(QMouseEvent * event)

函数,一旦鼠标移出窗口,我就用

 QCursor::setPos (int x, int y)

把它移回来。

这样做,功能是达到了,但是效果不是很好,每次尝试着将鼠标移出区域的时候,鼠标箭头都会在区域的边缘不停地抖动。

最近接触了一些Windows编程,然后发现可以用Windows API来限制鼠标的区域,下面是一段简单的代码:

#include "mainwindow.h"
#include
#include
#include

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键,那么当前的窗口失去鼠标,鼠标受限会被取消。

你可能感兴趣的:(Qt)