【问题标题】:Qt/C++: Signal for when a QListWidgetItem is checked?Qt/C++:检查 QListWidgetItem 时的信号?
【发布时间】:2010-11-23 05:02:18
【问题描述】:

在我的表单中,我有一个 QListWidget,其中包含可检查的 QListWidgetItems。我正在寻找一种方法来捕获QListWidgetItem 被选中/取消选中的事件。我没有看到任何这样的信号存在,但也许我错了。我目前正在做的是使用QListWidget::itemClicked() 信号并检查QListWidgetItemcheckState,但这不是我想要的,因为只要单击该项目,就会发生此事件,而不仅仅是选中标记切换。任何人都可以提供一些帮助吗?谢谢!

【问题讨论】:

  • 我想我可以使用 QListWidget::itemChanged() 信号来解决这个问题,当我选中/取消选中一个项目时会触发它,但如果我编辑项目的值也会触发它虽然我现在没有这样做,但仍然是一个不完美的解决方案。
  • QListWidget::itemClicked() 的另一个问题是当您使用键盘时它不会触发,例如使用空格键更改选中状态。

标签: c++ qt qlistwidget qt-signals


【解决方案1】:

显然没有提供这样的信号,你最好的办法是使用QListWidget::itemChanged(QListWidgetItem* item),然后扫描得到的item->checkState()。这应该比使用 itemClicked 略有改进

【讨论】:

  • 这是一个受保护的信号。当我按照here 的解释使用此错误时,我将面临一个错误。
  • itemChanged 并不总是触发;例如如果您突出显示该项目,然后反复按空格键。
  • @CodeLurker:这听起来像是一个错误。
  • 我错了。 itemChanged() 确实是拦截的正确信号。它确实在检查状态更改时触发。确保不要将它与 currentItemChanged() 混淆,后者不会。
【解决方案2】:

另一个选项是使用您自己的QAbstractListModelQListView。起初,这确实会添加一些额外的代码,因为您需要添加自己的管理代码。但是您确实获得了较低级别的访问权限。基本上是因为QListView 会询问您的模型该做什么。它还会将输入转发回您的列表模型,您可以在其中连接到它。

或者,您可以将QStandardItemModel 子类化并捕获与更改复选框相关的某些编辑。

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多