【问题标题】:setSelectionModel in QListWidget stops emission of itemSelectionChanged signalQListWidget 中的 setSelectionModel 停止发射 itemSelectionChanged 信号
【发布时间】: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 的调用,但这没有帮助。

非常感谢任何帮助。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

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

    另外,来自QListWidget 文档,

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

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

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

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

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

    QListWidget

    QAbstractItemView


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

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2020-10-10
      • 2020-04-08
      相关资源
      最近更新 更多