ListView флажков в PyQt - PullRequest
9 голосов
/ 11 мая 2009

Я хочу отобразить QListView, где каждый элемент является флажком с некоторой меткой. Флажки должны быть видны всегда. Один из способов, который я могу придумать, - использовать собственный делегат и QAbstractListModel. Есть ли более простые способы? Можете ли вы предоставить самый простой фрагмент, который делает это?

Заранее спасибо

Ответы [ 2 ]

21 голосов
/ 13 мая 2009

Я использовал метод, предоставленный 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 вместо флагов.

10 голосов
/ 12 мая 2009

Если вы пишете свою собственную модель, просто включите Qt.ItemIsUserCheckable Отметьте возвращаемое значение из метода flags() и убедитесь, что вы возвращаете допустимое значение для Qt.CheckStateRole из метода data().

Если вы используете класс 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()
...