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】:根据QAbstractItemView
的Qt
文档,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 信号的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在 PyQt 中查询 QListWidget 中的多个选定项