#QT技巧 - 通过eventFilter解决QWidget子控件影响滑动事件问题
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
目录
环境:
QT版本:5.6.2
编译器:VS2013
系统环境:Windows 7 64bit
基础内容阅读:
QT基础 - 事件过滤机制
##1.前言
现在要实现如下功能:
在一个QWidget上有好多的子QWidget,每个子QWidget上显示一张图片,鼠标点击具体图片时显示图片详细信息,鼠标在父QWidget滑动时,界面滑动出更多的QWidget。
实际操作中,子QWidget的事件会影响父类的操作,如在子QWidget点击,则不会响应父类的滑动事件。
##2.如何解决子类对父类事件的影响
在QT基础 - 事件过滤机制一文中提到:
事件过滤就是提前截获发往某个对象的所有消息,根据需要屏蔽掉某一些,或者对某些消息提前进行些处理。
因此,我们的解决思路就是:
让所有的子类安装事件过滤器installEventFilter,通过重写监视对象的eventFilter()函数处理目标对象的事件。
##3.代码实现
//安装过滤器
DragScrolldWidget::DragScrolldWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::DragScrolldWidget)
{
ui->setupUi(this);
ui->detialsWidget->installEventFilter(this);//安装事件过滤器
...
}
bool DragScrolldWidget::addWidget(QWidget *pwidget)
{
...
QPoint pos;
pwidget->setParent(ui->detialsWidget);
//给每个子窗体安装事件过滤器,用于整体的点击、滑动处理
pwidget->installEventFilter(this);
pwidget->move(pos.x(),pos.y());
pwidget->show();
...
}
bool DragScrolldWidget::eventFilter(QObject *target, QEvent *event)
{
//停止对事件的响应,需要返回true
bool bRet = false;
switch (event->type()) {
case QEvent::MouseButtonPress:
{
//滑动鼠标开始
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if(mouseEvent)
{
this->setCursor(Qt::OpenHandCursor);//设置鼠标形状
startGlobalPos = ui->detialsWidget->mapToGlobal(mouseEvent->pos());//获取按下位置
}
mouseEvent=NULL;
bRet = true;//停止对事件的响应,需要返回true
break;
}
case QEvent::MouseMove:
{
//滑动过程中
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if(mouseEvent)
{
QPoint endPos= ui->detialsWidget->mapToGlobal(mouseEvent->pos());//全局释放的鼠标位置
QPoint dis=endPos-startGlobalPos;//计算起始结束点差值
}
mouseEvent=NULL;
}
bRet = true;//停止对事件的响应,需要返回true
break;
}
case QEvent::MouseButtonRelease:
{
//滑动鼠标结束
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if(mouseEvent)
{
this->setCursor(Qt::ArrowCursor);//设置鼠标形状
QPoint endPos = ui->detialsWidget->mapToGlobal(mouseEvent->pos());//全局释放的鼠标位置
QPoint dis = endPos- startGlobalPos;//计算起始结束点差值
//滑动长度大于设定值,认为是有效的滑动
if(abs(dis.x()) > MIN_MOVE_DIS)
{
if(dis.x() > 0)
{
//向右滑动
}
else
{
//向左滑动
}
bRet = true;//停止对事件的响应,需要返回true
}
else
{
//无效滑动,认为是点击事件。继续处理响应
bRet = false;//停止对事件的响应,需要返回true
}
mouseEvent=NULL;
}
}
break;
}
default:
{
bRet = QWidget::eventFilter(target, event);;//停止对事件的响应,需要返回true
break;
}
}
return bRet;//停止对事件的响应,需要返回true
}
//过滤的widget鼠标事件
void boxdetailinfo::mousePressEvent(QMouseEvent* event)
{
}
void boxdetailinfo::mouseReleaseEvent(QMouseEvent *event)
{
//do something
}
Reference:
QT基础 - 事件过滤机制
觉得文章对你有帮助,可以扫描二维码捐赠给博主,谢谢!
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033