QListWidget 中的 setSelectionModel 停止发出 itemSelectionChanged 信

setSelectionModel in QListWidget stops emission of itemSelectionChanged signal

本文关键字:itemSelectionChanged 中的 setSelectionModel QListWidget      更新时间:2023-10-16

在我的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 的相同。我还尝试注释掉删除稍后的调用,但这没有帮助。

任何帮助非常感谢。

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

请注意,如果您在此函数之后调用 setModel(),则给定的 选择模型将替换为视图创建的模型。

此外,从QListWidget文档中,

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

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

此外,您无需按照Qt文档删除旧的选择模型

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

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

QListWidget

QAbstractItemView


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

这原来是一个Qt错误。请参阅我在Qt论坛上的两篇帖子和错误报告:

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

相关文章:
  • 没有找到相关文章