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();
}

这样一来,鼠标就只能在mainWinRect的范围内移动了,你也可以根据自身的需求设定RECT的值。
鼠标是公共的资源,如果你想取消限制,那么可以调用

ClipCursor(NULL)

来释放对鼠标的限制。

另外要注意的是:
①假如你要限制鼠标在xxWidget内,只能等xxWidget实例被构建之后才能限制鼠标范围。
②如果在鼠标受限的时候,用户按下了Windows键,那么当前的窗口失去鼠标,鼠标受限会被取消。

3 Thoughts on “Qt限制鼠标移动范围

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Post Navigation