递归禁用子窗口小部件鼠标滚轮事件

时间:2017-02-05 15:04:56

标签: c++ qt

我有一个QListWidget,其中包含一些自定义复杂的小部件。这些小部件包含QListWidget无权访问的子小部件。但是,后面的一些小部件是QComboBox,它们为它们抓取鼠标滚轮事件,而不是在列表中滚动。

我正在寻找一种方法来禁用这种抓取方式,以便列表可以从列表中的任何位置滚动,而不用担心它会改变其他内容。我可以找到所有可以从孩子那里学习的解决方案(安装事件过滤器或子类化),但我无法访问它。

有没有办法只从父母那里做到?

我会搜索孩子并安装过滤器,但层数是未知的。

1 个答案:

答案 0 :(得分:1)

我认为事件过滤器实际上是正确的方法,假设,即您希望所有后代QComboBox对象忽略轮事件。您可以在父窗口小部件上使用QObject :: findChildren,它将递归地为您提供所有QComboBox后代,无论向下多少级别。然后创建一个简单的事件过滤器,阻止轮事件并在这些子事件上安装该事件过滤器。

代码如下:

WheelBlocker *filter = new WheelBlocker ();
QList <QComboBox *> cblist = parent->findChildren <QComboBox *> ();

for (int i = 0; i < cblist.count(); i++)
{
    cblist[i]->installEventFilter (filter);
}

如果有一些原因你不希望所有后代组合框都以这种方式运行,并且没有任何识别它们的机制,那么这是行不通的。否则,它应该没问题,而且非常简单。您仍然需要编写WheelBlocker类,或者您可以在事件过滤器中创建任何类。无论哪种方式都是完全可以接受的。