PyQt中的复选框列表视图

10
我想展示一个QListView,其中每个项目都是一个带有标签的复选框。这些复选框应该始终可见。我可以想到的一种方法是使用自定义代理和QAbstractListModel。是否有更简单的方法?你能提供最简单的代码片段来实现吗?
谢谢您的预先帮助。
2个回答

24

我最终使用了 PyQt 邮件列表中 David Boddie 提供的方法。以下是基于他的代码的可工作片段:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
from random import randint


app = QApplication(sys.argv)

model = QStandardItemModel()

for n in range(10):                   
    item = QStandardItem('Item %s' % randint(1, 100))
    check = Qt.Checked if randint(0, 1) == 1 else Qt.Unchecked
    item.setCheckState(check)
    item.setCheckable(True)
    model.appendRow(item)


view = QListView()
view.setModel(model)

view.show()
app.exec_()

注意:将调用 setData 更改为检查角色的 setCheckState 并使用 setCheckable 替代标志。


1
当这样的项目/复选框被切换时,会发出哪些信号(如果有)? - marcin
5
为了回答自己的问题,可以使用model.itemChanged,示例代码在这里:http://www.pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/。 - marcin
当高亮显示但未切换此项/复选框时,会发出哪些信号(如果有)? - grand

13
如果您正在编写自己的模型,只需在flags()方法返回值中包含Qt.ItemIsUserCheckable标志,并确保从data()方法返回Qt.CheckStateRole的有效值。
如果您使用QStandardItemModel类,则在传递给每个项的setFlags()方法的参数中包含Qt.ItemIsUserCheckable标志,并使用其setData()方法设置Qt.CheckStateRole的检查状态。
在交互式Python会话中,输入以下内容:
from PyQt4.QtGui import *

model = QStandardItemModel()
item = QStandardItem("Item")
item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
item.setData(QVariant(Qt.Checked), Qt.CheckStateRole)
model.appendRow(item)

view = QListView()
view.setModel(model)
view.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接