我有一个 QListWidget,其中包含一些自定义的复杂小部件。这些小部件包含 QListWidget 无权访问的子小部件。然而,后面的一些小部件是 QComboBoxes,它们为它们获取鼠标滚轮事件,而不是滚动列表。
我正在寻找一种方法来禁用这种抓取,以便可以从列表中的任何位置滚动列表而不用担心它会改变其他内容。我可以从 child 那里找到所有解决方案(安装事件过滤器或子类化),但我无权访问它。
有没有办法只从 parent 那里做到这一点?
我会搜索子项并安装过滤器,但层数未知。
最佳答案
我认为事件过滤器实际上是正确的方法,假设您希望所有后代 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 类,或者您可以创建在事件过滤器中完成的任何类。无论哪种方式都是完全可以接受的。
关于c++ - 递归禁用子部件鼠标滚轮事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053560/