子控件的鼠标消息怎么传递给父控件?

需求是在父widget上摆一个子widget后,当click子widget时:不进入到子widget的相关事件处理函数中,而是进入到父widget的对应事件处理函数中。比如进入到mousePressEvent()事件。通常情况下是子widget接收到消息,而父widget接收不到消息。毕竟:click的是子widget,其遮挡住了父widget,从而父widget接收不到这个事件。

     我做了一个测试: 在一个QWidget上建了一个QLabel。而后实现父QWidget的mousePressEvent(), 然后跟一下发现:当我click这个label时:居然能进入到父QWidget的mousePressEvent()中!但是如果把子改成QPushButton则进入不了!

     咨询了一下别人,得到的答案是:如果子widget没有accept或ignore该事件,则该事件会被传递给其父亲。

   事实也确实如此:

    ①对于QLabel: 如果不重写mouse处理函数,也没有设置事件过滤器等操作的话,则相当于:其对mouse这个事件一直没有进行处理,那没有进行处理的话,相当于上边所说的情况,此时该事件会被传递给其parent。

    ②而对于QPushButton而言:当click它时:其会发射clicked()信号,其实这就相当于它对该事件的一个operator过程。所以:这里它accept该事件并进行了对应处理。从而:无法传递给其父窗口。

    那么:对于一个继承而来的类,只要我们重写实现了其各个事件处理函数,则对应的事件肯定无法传递给其父widget!  哪怕重写的该事件处理函数的函数体为空!

   如果是标准的控件对象,则其肯定没重写各个事件处理函数。那消息能不能传递到父widget中,则取决于中途有没有使用事件过滤器等将该信号拦截下来了。

解决方案:

1. setAttribute(Qt::WA_TransparentForMouseEvents, true);

2. 例子:

假设红色控件在绿色控件之下,要使红色控件在绿色控件下面还可以进行鼠标拖动,绿色控件截获到鼠标事件后,“绕过”自己,向后面的控件发送消息:

void 绿色控件::mouseMoveEvent( QMouseEvent *e )
{
    QWidget::mouseMoveEvent(e);
    MyMouseEvent(e);
}
 
void 绿色控件::mousePressEvent( QMouseEvent *e )
{
    QWidget::mousePressEvent(e);
    MyMouseEvent(e);
}
 
void 绿色控件::mouseReleaseEvent( QMouseEvent *e )
{
    QWidget::mouseReleaseEvent(e);
    MyMouseEvent(e);
}
 
void 绿色控件::mouseDoubleClickEvent( QMouseEvent *e )
{
    QWidget::mouseDoubleClickEvent(e);
    MyMouseEvent(e);
}
 
void 绿色控件::MyMouseEvent( QMouseEvent *e )
{
    if (this->parentWidget())
    {
        // 将自己设为鼠标事件透明并重新搜索是否有后面的控件会响应鼠标事件。
        this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
        QPoint pt = this->mapTo(this->parentWidget(), e->pos());
        QWidget *w = this->parentWidget()->childAt(pt);
        if (w)
        {
            pt = w->mapFrom(this->parentWidget(), pt);
            QMouseEvent *event = new QMouseEvent(e->type(), pt, e->button(), e->buttons(), e->modifiers());
            QApplication::postEvent(w, event);
        }
        // 将自己设为鼠标事件不透明,以免影响button的功能
        this->setAttribute(Qt::WA_TransparentForMouseEvents, false);
    }
}

参考文章:https://blog.csdn.net/qq_32250025/article/details/78257215

                    https://www.cnblogs.com/qq78292959/archive/2012/08/19/2646210.html

猜你喜欢

转载自blog.csdn.net/Scarlett_OHara/article/details/86306012