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

标签: QT父子对象事件影响 eventFilter installEventFilter
11人阅读 评论(0) 收藏 举报
分类:

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


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:12951803

目录


环境:
QT版本:5.6.2
编译器:VS2013
系统环境:Windows 7 64bit

基础内容阅读:
QT基础 - 事件过滤机制


1.前言

现在要实现如下功能:
在一个QWidget上有好多的子QWidget,每个子QWidget上显示一张图片,鼠标点击具体图片时显示图片详细信息,鼠标在父QWidget滑动时,界面滑动出更多的QWidget。

实际操作中,子QWidget的事件会影响父类的操作,如在子QWidget点击,则不会响应父类的滑动事件。

2.如何解决子类对父类事件的影响

QT基础 - 事件过滤机制一文中提到:
事件过滤就是提前截获发往某个对象的所有消息,根据需要屏蔽掉某一些,或者对某些消息提前进行些处理。

因此,我们的解决思路就是:
让所有的子类安装事件过滤器installEventFilter,通过重写监视对象的eventFilter()函数处理目标对象的事件。

3.代码实现

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
}

Reference:
QT基础 - 事件过滤机制

觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
微信
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:12951803

查看评论

qt 为什么不能响应eventFilter

有可能是下面几个问题 1:是不是没有installEventFilter,如果没有设置都不响应 ui->lineEdit->installEventFilter(this); 2:如果偶尔响应有时...
  • wslzj2003
  • wslzj2003
  • 2017-11-20 22:00:16
  • 210

QT禁止父窗口样式影响子控件样式

QDialog { **** } 改为 QDialog#myDlg { *** } 即,指定对象名。
  • dyzhen
  • dyzhen
  • 2016-04-21 13:39:46
  • 2979

QT中eventFilter的使用方法

这篇文章一扫我心头的疑云,对QT中的事件加深了理解,希望这篇文章也能帮到你。一直对Event Filter似懂非懂, 通过看C++ GUI Programming with Qt4, Second E...
  • u011915578
  • u011915578
  • 2015-07-26 15:10:00
  • 9652

学习记录-Qt窗口控件的动态添加和删除

一般用Qt写软件,使用designer创建一个窗口,拖几个控件进行一下布局就够用了,但有些需求,需要自定义各种类型的控件,并且很多控件需要根据数据的交互,动态的添加和删除,为此学习了一下Qt的实现方法...
  • u013399898
  • u013399898
  • 2016-07-02 18:28:55
  • 8982

Qt Focus事件处理及eventFilter的用法

在我的前一篇文章中,我实现了QLineEdit获得焦点高亮显示与失去焦点恢复原样的操作,是通过重新继承该类,再重构该事件函数的方式。这篇文章紧跟那篇文章,这里要实现的功能也是一样的,而是通过另外不同的...
  • zzwdkxx
  • zzwdkxx
  • 2014-06-05 20:36:19
  • 9064

QT给父控件设置样式不影响子窗体

1. 如果是在Creator中设置,可在stylesheet中加上”#XXX“;例如 “#myGroupBox{color:red}”,那么group的背景色变成红色的! 2. 在代...
  • liulihuo_gyh
  • liulihuo_gyh
  • 2017-09-28 16:27:14
  • 618

Qt删除layout的控件

基于某些原因,我们可能希望往一个布局内动态删除和添加新的元素,添加我们都能很清楚得看到addWidget这个接口.删除的话官方也有示例: QLayoutItem *child;...
  • xy913741894
  • xy913741894
  • 2017-08-07 10:21:19
  • 1002

关于QT利用setStyleSheet为主控件添加背景图片,而不影响其子控件的背景设置

关于这个问题我查看了许多人的博客,发现有些人回避利用setStyleSheet进行主控件添加背景图片,因为这种方法会使子控件继承朱控件的背景格式,但是通过细心查找还是研究  出来如何解决这个问题。 ...
  • QQ528805117
  • QQ528805117
  • 2015-07-15 17:55:12
  • 2423

Qt:QWidget设置控件的层次关系

设置控件置于父窗口的顶部:widget->raise(); 设置控件层次:widget->stackUnder(other_widget);...
  • tieshuxianrezhang
  • tieshuxianrezhang
  • 2018-01-31 19:09:37
  • 288

installEventFilter的使用

voidQObject::installEventFilter ( const QObject * obj ) 安装事件过滤器obj到这个对象。 事件过滤器就是接收所有被发送到这个对象的事件的对象...
  • wang_hu_feng
  • wang_hu_feng
  • 2014-09-29 21:07:46
  • 3266
    公告
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 35万+
    积分: 4950
    排名: 7154
    博客专栏
    最新评论