【问题标题】:QComboBox::showPopup() steals focus from its QLineEditQComboBox::showPopup() 从其 QLineEdit 中窃取焦点
【发布时间】:2019-07-08 08:53:50
【问题描述】:

为了创建一个可以在输入时过滤其值列表的 QComboBox,我在 QComboBox 的 editTextChanged 事件上附加了一个插槽,以便在用户开始输入时打开其列表视图弹出窗口。这样做是这样的:

void SearchableComboBox::slotEditing(QString in_text)
{
    this->showPopup();
}

不幸的是,这立即夺走了 QLineEdit 的焦点,我不能再打字了。 调用 lineEdit()->setFocus() 没有任何区别,我不想 grabKeyboard() 因为这会造成另一个痛苦的世界。 有什么建议吗?

【问题讨论】:

  • 在弹出窗口显示后调用 setFocus()。
  • 不行,没区别。

标签: c++ qt focus qwidget qcombobox


【解决方案1】:

为此目的使用焦点代理方法。见https://doc.qt.io/qt-5/qwidget.html#setFocusProxy

这样,弹出窗口会将其输入中继到 lineedit。

在您的情况下,您可以尝试类似

this->setFocusProxy( this->lineEdit() );

但也许您应该阅读如何使用QCompleter。这将在键入时提供自动完成功能,并且可能对您也有用。

【讨论】:

  • 不工作。您的示例生成消息“QComboBox () 已经在焦点代理链中”,并且将弹出窗口的代理设置为行编辑 (view()->setFocusProxy(lineEdit()) 根本没有任何作用。QCompleter 对我来说不是一个好的解决方案,因为搜索词可以产生多个匹配,用户应该会收到一个可能的匹配列表以供选择。
  • 在这种情况下,我认为您最好编写自己的 ComboBox。从 QLineEdit 开始并将 QListView 显示为弹出窗口。这样你就可以完全控制现在被内部 QComboBox-Popup 偷走的焦点。另一个优点是您可以通过 QSortFilterProxyModel 轻松过滤列表的模型。值得努力恕我直言
猜你喜欢
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多