Просмотр списка флажков в PyQt
-
21-08-2019 - |
Вопрос
Я хочу отобразить 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
вместо флагов.