QT技巧 - 通过eventFilter解决QWidget子控件影响滑动事件问题

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itas109

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值