Qt移动窗体之鼠标事件的重写

在使用Qt开发界面时往往会涉及使用鼠标拖动窗体,鼠标可以直接按住窗体边框拖动,当鼠标按住窗体内部拖动时就需要重写鼠标事件。

重写鼠标事件来移动窗体的思路有两种

第一种:移动位置=(鼠标移动位置)-(鼠标相对于窗体左上角的位置)

//鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    dragPosition=event->globalPos()-frameGeometry().topLeft();   
}

//鼠标移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    move(event->globalPos()-dragPosition);
}

Qt移动窗体之鼠标事件的重写_第1张图片

dragPosition为QPoint变量,保存鼠标相对于窗体左上角的位置,它由鼠标相对于屏幕(黑色边框)的全局位置globalPos()减去窗体(红色边框)相对于屏幕的左上角位置topLeft()frameGeometry()可以理解为指代窗体这个对象)。1是窗体左上角相对于屏幕的位置,3是鼠标相对于屏幕的位置,3的位置减去1的位置就得到3相对于1的位置,也就是鼠标相对于窗体左上角的位置。这个点的坐标值为(dx,dy),也就是3距离1的宽度(dx),3距离1的高度(dy)。

现在要将窗体从红色位置移动到蓝色位置(只分析一个方向的移动好理解,其他方向移动是一样的),鼠标按住3这个位置向右移动,移动到4这个位置,移动后鼠标相对于窗体的位置没有改变,鼠标只是相对于屏幕的位置发生了改变。也就是图中3相对于1的位置与4相对于2的位置是一样的,即dx和dy的值没有改变。

move(int x, int y)函数中的x和y值指的是移动后窗体的左上角位置,也就是说move函数中要传入要移动位置的x,y值。这个值是左上角的x、y值。也就是说我们要得到2位置的x、y值,根据上述分析,只需将4位置的x、y值分别减去dx、dy就得到2位置的x、y值,也就是此时鼠标的全局位置globalPos()鼠标相对于窗体左上角的位置dragPosition(dragPosition的位置值就是dx和dy)。(move函数说明:move函数有两个,一个是move(int x, int y),一个是move(const QPoint &p),前者是后者的重载函数,使用哪个都可以,只是传入的参数不同,第一个传入两个int类型的值x和y,第二个传入一个QPoint对象,QPoint对象是屏幕上的一个点对象,它具有x和y两个参数。在系统调用中,是move(int x, int y)调用move(const QPoint &p)的,调用方式为

move(int x, int y)
{
    move(QPoint(x, y));
}

所以真正执行的的函数是move(const QPoint &p),代码中也是用这个函数,这里为了说明清楚,我用move(int x, int y),其实它们的作用是一样的。)

 

第二种:移动位置=(窗体的初始位置)+(鼠标移动距离)

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    last = event->globalPos();
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    int dx = event->globalX() - last.x();
    int dy = event->globalY() - last.y();

    last = event->globalPos();
    move(x()+dx, y()+dy);
}

Qt移动窗体之鼠标事件的重写_第2张图片

last变量保存鼠标相对于屏幕的全局位置,在图中是3这个位置。将窗体从红色位置移动到蓝色位置,也就是1号位置移动到2号位置,3号位置移动到4号位置,它们的移动距离是一样的。移动距离dx等于鼠标的全局X值减去last的x值(这里没有分析y,因为是水平移动的只有x轴发生变化),也就是4号位置的x坐标减3号位置的x坐标就是移动距离。

2号位置坐标的x坐标就为x()函数的值加上dx值(x()函数为窗体距离屏幕左侧的长度,y()函数为窗体距离屏幕顶端的长度),而dx值已由event->globalX() - last.x()获得。

以上就是两种Qt移动窗体重写鼠标事件的方法!!!

你可能感兴趣的:(Qt)