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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top