QListWidget 中的 setSelectionModel 停止发射 itemSelectionChanged 信号

Posted

技术标签:

【中文标题】QListWidget 中的 setSelectionModel 停止发射 itemSelectionChanged 信号【英文标题】:setSelectionModel in QListWidget stops emission of itemSelectionChanged signal 【发布时间】:2016-01-27 23:19:53 【问题描述】:

在我的 QListWidget 子类中,当我使用 setSelectionModel 替换其 QItemSelectionModel 时,列表小部件停止发出其 itemSelectionChanged 信号。在实际代码中,我这样做是为了安装 QItemSelectionModel 的子类,但即使我只使用新的 QItemSelectionModel 也会出现问题。

MyListWidget::MyListWidget(QWidget* parent)
    : QListWidget(parent)

    QItemSelectionModel* oldSelectionModel = selectionModel();
    QItemSelectionModel* newSelectionModel = new QItemSelectionModel(model(), oldSelectionModel->parent());
    setSelectionModel(newSelectionModel);
    oldSelectionModel->deleteLater();

在调试器中,我可以看到 QItemSelectionModel 发出其 selectionChanged 信号,但 QListWidget 从未发出其对应的 itemSelectionChanged 信号。

如果我注释掉这个构造函数的主体,一切正常。和以前一样,我可以看到 QItemSelectionModel 发出其 selectionChanged 信号,但现在触发 QListWidget 发出 itemSelectionChanged。

看起来我对 setSelectionModel 的调用导致 QItemSelectionModel::selectionChanged 和 QListWidget::itemSelectionChanged 之间的连接中断。

顺便说一句,我检查了我是否将错误的参数传递给我的新 QItemSelectionModel。在我创建它之后,newSelectionModel 的 model() 和 parent() 与 oldSelectionModel 的相同。我还尝试注释掉对 deleteLater 的调用,但这没有帮助。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

根据QAbstractItemViewQt 文档,setSelectionModel 替换了当前的选择模型,如果在此之后调用 setModel(),它将不起作用。

注意,如果你在这个函数之后调用 setModel(),给定的 selectionModel 将被视图创建的替换。

另外,来自QListWidget 文档,

QListWidget 是一个方便的类,提供类似的列表视图 到 QListView 提供的那个,但是有一个经典的基于项目的 添加和删​​除项目的界面。 QListWidget 使用内部 模型来管理列表中的每个 QListWidgetItem。

看起来每当您添加项目时,模型都会更新/刷新,从而使您的自定义选择模型无效(只是我的想法)。

另外,您不需要按照Qt docs 删除旧的选择模型

注意:如果出现以下情况,则由应用程序删除旧的选择模型 不再需要它;即,如果它没有被其他视图使用。 这将在其父对象被删除时自动发生。 但是,如果它没有父级,或者父级是 长寿命的对象,最好调用它的 deleteLater() 显式删除它的函数。

如果您想要这种级别的自定义,QListView 可能是更好的选择。

QListWidget

QAbstractItemView


只是想知道,您是否尝试在将所有项目添加到列表小部件后设置自定义选择模型?

【讨论】:

【参考方案2】:

结果证明这是一个 Qt 错误。请参阅我在 Qt 论坛上的两篇文章和错误报告:

http://forum.qt.io/topic/63676/qlistwidget-how-to-prevent-unselect-all/2 http://forum.qt.io/topic/63674/qlistwidget-setselectionmodel-stops-emission-of-itemselectionchanged-signal https://bugreports.qt.io/browse/QTBUG-50891

【讨论】:

以上是关于QListWidget 中的 setSelectionModel 停止发射 itemSelectionChanged 信号的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 QListWidget 中的所有选定项目?

处理 QListWidget 中的数千个项目并减少延迟

QListWidget 中的项目在重新排序后变为不可见

Python:如何在 PyQt 中查询 QListWidget 中的多个选定项

在单击+拖动时禁用 QListWidget 中的自动选择项目

使用 python 编辑 QlistWidget 中的部分行