【问题标题】:Recursively disable child widgets mouse wheel events递归禁用子小部件鼠标滚轮事件
【发布时间】:2017-02-07 02:49:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你想打破大锤,你可以在你的 qApp 对象中覆盖 QApplication::notify(QObject*,QEvent*) (显然你需要继承 QApplication)并拦截/重定向 QObject 原来是 QListWidget 中的 QComboBox 之一的任何调用。
  • 哇,这有点太大了。但是很高兴知道它,无论如何:)

标签: c++ qt


【解决方案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 类,或者您可以在事件过滤器中创建正在执行的任何类。无论哪种方式都是完全可以接受的。

【讨论】:

  • 是的,这最终成为一个可怕的问题。但我永远不会猜到 findChildren 是递归的。但是为了让小部件在选择时响应这些事件,我必须添加cblist[i]-&gt;setFocusPolicy(Qt::StrongFocus);,我找到了here。 (这不是问题,只是一些额外的信息)
  • 很高兴知道它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多