如何在Qt的层次结构的根小部件中获得鼠标按下的事件



我有以下问题与Qt(没有答案在这个网站似乎解决了这个问题,所以我创建我自己的问题)。

我有一个应用程序的MainWindow类继承自QWidget。在某一点上,主窗口内有一个表,我想捕获表外的所有鼠标按下的事件

我的第一个解决方案是重新实现 方法
/* virtual */ void MainWindow::mousePressEvent(QMouseEvent *event)

在此方法中,我检查事件的位置并检查它是否在表的QRect中。不幸的是,我意识到mousePressEvent()并不总是被调用。我怀疑,如果我点击MainWindow的另一个子小部件,该小部件会使用该事件,而不会将其传递给父部件。

所以我唯一的替代想法是为所有包含在主窗口中的小部件重新实现mousePressEvent()方法。这当然是不可行的,因为:

  1. 有很多:这将是非常复杂的,耗时的,容易出错的,并且很难维护,如果一个人不得不改变所有的小部件类,在MainWindow中实例化。
  2. 一些子部件是在并行项目中开发的一些库模块中实现的,所以我不能更改它们。
  3. 在其他情况下,子部件直接使用Qt类。
  4. 即使我为2和3定义了自定义子类,我也必须确保这些子类在任何地方使用,而不是原始类。这可能意味着再次退回到情形2。

所以这个替代方案对我来说似乎不可行。

总结:你知道是否有一个简单的方法可以从MainWindow类中捕获所有在主窗口上的鼠标点击?

您可以通过在主窗口中安装事件过滤器来实现这一点。看看Qt文档中的QObject::installEventFilter()

您可以将属性Qt::WA_TransparentForMouseEventsQWidget::setAttribute设置为除表之外的所有子部件,以获得MainWindow中的鼠标事件(仅当表是MainWindow的直接子时才会起作用)。

或者相反,在整个MainWindow上面添加一个透明的小部件,在表的位置有一个孔。当您希望它让点击通过或捕获它们时,您可以设置/取消对该小部件的Qt::WA_TransparentForMouseEvents设置。
可以用QWidget::setMask()QRegion::substracted()创建孔

最新更新