PyQt中的复选框ListView

10 投票
2 回答
26845 浏览
提问于 2025-04-15 11:30

我想显示一个QListView,每个项目都是一个带标签的复选框。这些复选框应该始终可见。我想到的一种方法是使用自定义代理和QAbstractListModel。还有没有更简单的方法呢?能不能给我一个最简单的代码示例来实现这个功能?

提前谢谢你!

2 个回答

24

我最后用了David Boddie在PyQt邮件列表中提供的方法。下面是基于他代码的一个可用示例:

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替代了标志。

14

如果你在自己写一个模型,只需要在返回的值里加上 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()

撰写回答