Qt忽略小部件中另一个部件上的任何鼠标事件

时间:2019-06-07 20:44:22

标签: c++ qt

我有一个QTableView,如果鼠标悬停在活动单元格上,则会出现一个小标记。该标记是一个小部件,如果悬停时会发出信号,当我将鼠标移到桌子上时会更改桌子的选择模式。 问题是,如果我超过了标准,我将无法拖到桌子上。 我尝试过的事情:

  • 将窗口小部件标记设置为setWindowFlags(Qt::WindowTransparentForInput);,但是我无法使用它,因为我需要悬停事件。
  • 使用event->ignore()忽略小部件标记中的事件,或使用and eventFilter将事件发送给父级:

    bool EventFilterMarca::eventFilter(QObject *obj, QEvent *event)
    {
         if( event->type() == QEvent::HoverMove)
         {
           ....
         }
         else if (event->type() == QEvent::MouseButtonPress ||
                              event->type() == QEvent::MouseButtonRelease ||
                              event->type() == QEvent::MouseMove ||
                              event->type() == QEvent::MouseButtonDblClick)
                    {                
                        //QApplication::sendEvent(parent(),event);//one try
                        //event->ignore();//another try
                        return QObject::eventFilter(obj,event);;
                    }
            }
    
  • 在标记小部件中将mousePressEventmouseReleaseEventmouseMoveEvent子类化,并调用父类。看起来是否可行(将事件传递给父级)到表的当前单元格(父级)中:

void Marca::mousePressEvent(QMouseEvent *event)

{
    //event->setAccepted(false);
    if(event->buttons() == Qt::LeftButton)
    {
        MiTabla* tabla = qobject_cast<MiTabla*>(parent());
        if (tabla)
        {
            tabla->mousePressEvent(event);
            //QApplication::sendEvent(parent(),event);
        }
    }
    //event->ignore();
}

好吧,问题是,如果我在单元格的小部件上方或直接在单元格上,如何获得表的行为相同?

我还添加了第一种获取链接的链接。它可以工作,但是代码很糟糕并且不容易遵循:

https://github.com/exodehm/tablacalc

1 个答案:

答案 0 :(得分:0)

我认为事件过滤器不是您想要的。这就是使小部件不接收特定事件的原因。您实际上想要做的是将事件标记为由特定小部件不处理,将其放在要处理的类中较高的位置。为此,您应该尝试重新实现小部件:: event方法,或更具体的处理程序。

在qt文档中说:

  

布尔QWidget :: event(QEvent * event)

     

如果事件被识别,则此函数返回true,否则返回false。如果接受了公认的事件(请参阅QEvent :: accepted),则将停止任何进一步的处理,例如将事件传播到父窗口小部件。

因此,我认为您应该做的基本上是在要传播到父窗口小部件的特定事件类型发生在窗口小部件上时将事件标记为不接受。

所以在您的情况下,我会期望像这样:

void QWidget::dropEvent(QDropEvent *event) {
   event->setAccepted(false);
}

为使此功能正常运行,您的表还必须是标记窗口小部件的父窗口小部件。