qt linux实现鼠标位置自动移动,Qt:支持鼠标拖动来移动内容的窗口

最近有个Qt的项目碰到问题,问题是这样的:

要使Qt的窗口内容支持drag移动,即按住鼠标左键在窗口里移动时,窗口的滚动条和内容随着鼠标的移动而移动。

实现的方法实现一个类,此类派生自QScrollArea,安装事件过滤器,对鼠标的事件进行处理来实现内容的移动。

代码如下:

头文件

#include

class

{MyScrollArea:publicQScrollArea

这样就可以使用这个类来做窗口的parent,这样里面的内容就支持拖动了。

Q_OBJECTpublic:QWidget* parent =NULL);

MyScrollArea(

~MyScrollArea(){};

protected:

bool eventFilter(QObject*obj,QEvent*evt);

private:boolmMoveStart;boolmContinousMove;QPointmMousePoint;

};

cpp文件

#include

#include

#include "myscrollarea.h"

MyScrollArea::MyScrollArea(QWidget* parent)

: QScrollArea(parent)

,mMoveStart(false)

{

installEventFilter(this);}

bool MSCScrollArea::eventFilter(QObject*obj,QEvent*evt)

{

if (evt->type() ==QEvent::MouseMove) {

QMouseEvent* me = (QMouseEvent*) evt;

if ((me->buttons() & Qt::LeftButton)) {

if (!mMoveStart) {

mMoveStart= true;

mContinousMove=false;

mMousePoint= me->globalPos();

}

else {

QScrollBar* scrollBar = verticalScrollBar();

QPointp = me->globalPos();

int offset = p.y() -mMousePoint.y();

if( !mContinousMove&& ( offset > -10 && offset < 10 ) )

return false;

mContinousMove= true;

scrollBar->setValue(scrollBar->value() - offset);

mMousePoint= p;

}

return true;

}

}

else if (evt->type() ==QEvent::MouseButtonRelease) {

mMoveStart= false;

}

returnQObject::eventFilter(obj, evt);

}

但我在使用过程中发现一个问题,如果窗口里的控件也实现了鼠标的move或release事件,那么这时候这2个事件就不会传到MyScrollArea,这样就会出现bug,但后来找到了解决办法,就是在控件的这两个事件的最后加上一行代码,

event->ignore();

这样就解决了,因为如果是将事件ignore掉的话,此事件还会忘父控件上传,这样的话,每层都ignore掉,最后会传到MyScrollArea里,这样MyScrollArea也就能正常处理鼠标事件了。

#include0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值