2016-09-05 12 views
0

Qt 4.8. Мне нужно, чтобы некоторые элементы в моем списке состояли из трех состояний. Поэтому я добавить следующий код:Частично проверьте элемент QListWidget щелчком мыши (tristate)

item = QtGui.QListWidgetItem("Hello there") 
item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable | 
    QtCore.Qt.ItemIsTristate) 
item.setCheckState(QtCore.Qt.PartiallyChecked) 

Элемент успешно установлен частично проверено состояния на его создание, но дальнейшие щелчки мыши переключить его между проверил/непроверенных состояния.

ответ

0

Потому что мы не можем сделать QListWidget перебирать 3 состояний автоматически в Qt 4.8 (ItemIsUserTristate флаг был добавлен в Qt 5.5), мы будем делать это вручную:

CHECKSTATE_ROLE = 32 

def lstFiles_itemChanged(self, item): # slot 
    if item.flags() & QtCore.Qt.ItemIsTristate: 
     if item.checkState() == QtCore.Qt.Checked and \ 
         item.data(CHECKSTATE_ROLE) == QtCore.Qt.Unchecked: 
      item.setCheckState(QtCore.Qt.PartiallyChecked) 
     item.setData(CHECKSTATE_ROLE, item.checkState()) 

item = QtGui.QListWidgetItem("Buenas noches") 
if this_item_needs_tristate: 
    item.setFlags(item.flags() | QtCore.Qt.ItemIsTristate) 
    state = QtCore.Qt.PartiallyChecked 
else: 
    state = QtCore.Qt.Checked 
item.setCheckState(state) 
item.setData(CHECKSTATE_ROLE, item.checkState()) 

Элемент помнит свою предыдущую проверку состояния в элементе данных пользователя, чтобы мы могли соответствующим образом изменять состояния на itemChanged.

1

QtCore.Qt.ItemIsTristate устарел, он был заменен на ItemIsAutoTristate, который автоматически обрабатывает статус частичной проверки предметов с дочерними элементами.

С Qt 5.5 вы можете использовать QtCore.Qt.ItemIsUserTristate, чтобы иметь нужное поведение.

+0

Непросто сделать это в Qt 4.8? – Winand

+0

Итак, 'ItemIsTristate' работает в' QTreeWidget'. Из документов: 'Элементы в иерархических моделях могут быть частично проверены, если проверяются некоторые, но не все их дочерние элементы. 'В этом случае это не имеет никакого отношения к' QListWidget'. И очевидно, почему флаг был переименован в «ItemIsAutoTristate». – Winand

Смежные вопросы