PyQt中复选框的ListView

Eli*_*sky 9 python qt pyqt qlistview qitemdelegate

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

提前致谢

Eli*_*sky 20

我最终使用了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_()
Run Code Online (Sandbox Code Playgroud)

注意:将setData具有检查角色的调用更改为setCheckState并使用setCheckable而不是标记.

  • 为了回答自己,可以使用`model.itemChanged`,如下所示:http://www.pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/ (4认同)

小智 9

如果你正在写自己的模型,只包括Qt.ItemIsUserCheckable 从返回的值标记flags()方法,并确保您的返回有效值Qt.CheckStateRoledata()方法.

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

在交互式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()
Run Code Online (Sandbox Code Playgroud)