QListWidget中的setSelectionModel停止发送itemSelectionChanged信号

时间:2016-01-27 23:19:53

标签: c++ qt

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

$(self.el).html(self.template({card: item}));

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

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

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

顺便说一下,我查看是否将错误的参数传递给我的新QItemSelectionModel。创建它之后,newSelectionModel的model()和parent()与oldSelectionModel的相同。我也试着评论对deleteLater的调用,但这没有帮助。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:0)

根据Qt的{​​{1}}文档,QAbstractItemView会替换当前的选择模型,如果在此之后调用setSelectionModel,它将无法工作。

  

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

另外,来自setModel()文档,

  

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

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

此外,您不需要按照QListWidget文档删除旧的选择模型

  

注意:应用程序可以删除旧的选择模型   它不再需要;即,如果其他观点没有使用它。   这将在删除其父对象时自动发生。   但是,如果它没有父级,或者父级是a   长寿命对象,最好调用它的deleteLater()   函数明确删除它。

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

QListWidget

QAbstractItemView

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

答案 1 :(得分:0)