【问题标题】:Prevent editable QComboBox selection from changing when item list modified防止修改项目列表时更改可编辑的 QComboBox 选择
【发布时间】:2019-11-05 14:05:29
【问题描述】:

我有一个包含 ID 号列表的可编辑 QComboBox。

ID 号代表连接到系统的设备。这些设备在运行时经常被添加和删除。

可编辑组合框的目的是在其列表中包含当前附加的 ID 列表,以便于选择,但同时允许用户手动输入当前不存在的设备的 ID。此外,可以为 ID 输入空字符串。

基本上,我想为用户提供一种输入任意(或不输入)ID 的方法,以及快速选择当前连接的设备(在运行时更改)的额外好处。

我目前没有使用列表模型来维护列表,我只是使用 QComboBox 的添加和删除功能。

如果添加或删除设备,我需要不更改选择。但是,我遇到了以下问题:

  • 从列表中删除当前输入的 ID(手动或通过列表选择)时,选择将更改为列表中的另一个 ID。
  • 当列表为空且手动输入 ID 或根本没有输入 ID 时,将 ID 添加到列表时会更改选择。

有没有办法让从组合框中添加和删除项目永远不会修改编辑框中的选择?甚至是实现我目标的其他 UI 元素?

【问题讨论】:

  • 看起来很简单:如果它是当前选择,请不要删除它。至于添加,如果当前行编辑内容不存在,则将其复制到列表中,将选择设置为该项目,然后添加新项目。您可能会重新评估您使用的控件是否合适。您似乎更希望使用下拉按钮进行简单的行编辑,该按钮会打开一个选择框,允许用户将 ID 复制到行编辑中。您可以查看组合框的属性,看看某些组合是否能满足您的需求。或者查看 qt 源代码以获取提示。
  • @kuba 好主意。我想我会做简单的编辑+下拉按钮的想法,它可以显示一个弹出菜单或其他东西,并且具有足够接近组合框的外观,这将是有意义的。谢谢。

标签: c++ qt qt5 qcombobox


【解决方案1】:

在更新组合框之前,将当前选择的 ID(或空白字符串)保存到临时文件中。多变的。修改组合框内容后,检查该 ID 是否仍然存在于组合框中(例如 findText())。如果是,请使用setCurrentIndex() 选择它。如果没有,请使用setCurrentText()setEditText() 进行设置。

【讨论】:

  • 这也是个好主意。我已经将其更改为行编辑 + 按钮 + 弹出菜单,但我明天会尝试一下,看看感觉有多流畅。
  • @JasonC 请注意,如果您在选择更改时依赖来自QComboBox 的信号(currentIndexChanged() 等),您可能希望在添加/删除项目时阻止这些信号并重新- 设置currentIndex 或文本(例如QObject::blockSignals()QSignalBlocker)。
  • 你的想法很有效。我将坚持使用弹出菜单。但这是一个完全可行的解决方案,你应该得到一些分数,有一个复选标记,哈哈。
猜你喜欢
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多