Вопрос

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

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

Это было полезно?

Решение

Если вы пишете свою собственную модель, просто включите 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()

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top