10

我想显示一个 QListView ,其中每个项目都是带有一些标签的复选框。复选框应始终可见。我能想到的一种方法是使用自定义委托和 QAbstractListModel。有没有更简单的方法?你能提供最简单的片段吗?

提前致谢

4

2 回答 2

23

我最终使用了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而不是标志。

于 2009-05-13T03:34:00.600 回答
13

如果您正在编写自己的模型,只需Qt.ItemIsUserCheckable 在方法的返回值中包含标志flags(),并确保您为方法返回Qt.CheckStateRole有效值data()

如果您使用QStandardItemModel该类,Qt.ItemIsUserCheckable 请在传递给每个项目的方法的标志中包含标志,并使用其方法setFlags()设置检查状态。Qt.CheckStateRolesetData()

在交互式 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()
于 2009-05-12T19:49:48.683 回答