撤销 setFlags ItemIsUserCheckable

3 投票
1 回答
5859 浏览
提问于 2025-04-17 18:57

我创建了一个QListWidget,想让它的元素在应用程序中的特定地方可以被勾选(我需要这样做是因为在这个应用中,用户需要先点击选择一个主要元素,然后再通过勾选框选择次要元素)。

我可以让这些元素可以勾选,但我找不到办法来撤销这个设置,去掉勾选框... 我这样做了:

for i in range(self.listWidget.count()):
         item=self.listWidget.item(i)
         item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
         item.setCheckState(QtCore.Qt.Unchecked) 

但接下来我遇到了困难... 我尝试了:

tmp=self.listWidget.takeItem(i)
self.listWidget.addItem(tmp)

但是这个项目又带着勾选框回来了 :( 我可以直接删除这个项目,然后再重新添加,但这样做可能会比较耗资源!有没有什么解决办法呢?

谢谢!

1 个回答

10

要去掉一个标志,可以试试:

item.setFlags(item.flags() ^ QtCore.Qt.ItemIsUserCheckable)

这里的 item 是你想要去掉标志的元素。简单来说,^ 这个符号的作用正好和 | 相反,它会把 item.flags() 返回的现有标志中,QtCore.Qt.ItemIsUserCheckable 这个标志排除掉。

更新:

虽然上面的代码会禁用可勾选的功能,但如果你想完全隐藏复选框,可以试试:

item.setData(Qt::CheckStateRole, QVariant());

需要注意的是,这样做之后,复选框的状态不会被保留。

撰写回答