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

标签 c++ windows qt

我在使用 Qt 时遇到以下问题(该网站上似乎没有答案可以准确解决这个问题,所以我创建了自己的问题)。

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

我的第一个解决方案是重新实现该方法

/* virtual */ void MainWindow::mousePressEvent(QMouseEvent *event)

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

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

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

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

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

最佳答案

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

关于c++ - 如何在 Qt 的层次结构的根小部件中获取鼠标按下事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7414256/

相关文章:

c++ - 性能:C++ 中的指针取消引用

C++ 将字符串转换为字符数组

windows - Powershell - 如何在屏幕锁定时获取窗口截图?

windows - 无法在 Windows Embedded Standard 上启用 EWF

c++ - QT_NO_DEBUG 是否会导致 NDEBUG 的定义?

c++ - 在函数调用c++中连接字符串

c++ - 如何判断一个点是否在矩形内?

c++ - Winsock - 连接问题

c++ - 将文件拖放到 QDialog 内的 QTreeWidget 中

c++ - 在 Xcode 中静态链接 Nvidia 的 Cg 框架