A ListView de caixas de seleção em PyQt
-
21-08-2019 - |
Pergunta
Eu quero mostrar um QListView onde cada item é uma caixa de seleção com algum rótulo. As caixas de seleção deve ser visível em todos os momentos. Uma maneira que eu posso pensar é usando um delegado personalizado e QAbstractListModel. São formas não mais simples? Você pode fornecer o trecho mais simples que faz isso?
Agradecemos antecipadamente
Solução
Se você está escrevendo o seu próprio modelo, basta incluir o Qt.ItemIsUserCheckable
bandeira no valor de retorno do método flags()
, e garantir que você voltar
um valor válido para o Qt.CheckStateRole
do método data()
.
Se você usar a classe QStandardItemModel
, inclua o Qt.ItemIsUserCheckable
bandeira naqueles que você passar para o método setFlags()
de cada item, e definir o cheque
estado para o Qt.CheckStateRole
com seu método setData()
.
Em uma sessão Python interativo, digite o seguinte:
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()
Outras dicas
Acabei usando o método fornecido por David Boddie na lista de discussão PyQt. Aqui está um trabalho snippet com base em seu código:
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_()
Nota:. Mudado a chamada de setData
com um papel de verificação para setCheckState
e setCheckable
usado em vez de bandeiras