Почему не работает setAutoTristate

Мне нужно:

  1. отобразить данные в древовидной структуре
  2. эти данные фильтровать
  3. возможность ставить галочку на дочерние и родительские элементы
  4. если на родительский элемент поставить галочку, то галочка поставилась и на все дочерние элемены и наоборот. 1, 3 и 4 решаются с помощью вот этого кода:
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.Qt import Qt
import sys

def main(): 
    app     = QtWidgets.QApplication(sys.argv)
    tree    = QtWidgets.QTreeWidget()
    #tree    = QtWidgets.QTreeView()
    #headerItem  = QtWidgets.QTreeWidgetItem()
    #item    = QtWidgets.QTreeWidgetItem()


    for i in range(3):
        parent = QtWidgets.QTreeWidgetItem(tree)
        parent.setText(0, "Parent {}".format(i))
        parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
        for x in range(5):
            child = QtWidgets.QTreeWidgetItem(parent)
            child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
            child.setText(0, "Child {}".format(x))
            child.setCheckState(0, Qt.Unchecked)
    tree.show() 
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

1, 2 и 3 решаются с помощью следующего кода (4 пункт должен был решаться то же тут после добавления item.setAutoTristate(True), но почему то не получилось):

from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.Qt import Qt
import sys

def on_clicked():
    s = line.text()
    proxyModel.setFilterRegularExpression(s)

app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("Класс QSortFilterProxyModel")
window.resize(600, 500)
view1 = QtWidgets.QTreeView()
view2 = QtWidgets.QTreeView()

view1.setSortingEnabled(True)


view2.setRootIsDecorated(True)
view2.setExpandsOnDoubleClick(True)
model = QtGui.QStandardItemModel()


d = {
    'year':[2015, 2016, 2017, '75D', 'dom'],
    'tag':['hello', 'world', 'dom'],
    'color':['red', 'blue', 'white', 'black', 'green', 'yellow', 'dom']
}
for i in d.keys():
    parent = model.invisibleRootItem()
    item = QtGui.QStandardItem(f'{i}')
    item.setEditable(False)
    item.setCheckable(True)
    item.setAutoTristate(True)
    print(item.isAutoTristate())
    #item.setFlags(Qt.ItemIsAutoTristate | Qt.ItemIsUserCheckable)
    parent.appendRow(item)
    parent = item
    for ii, j in enumerate(d[i]):
        item = QtGui.QStandardItem(f'{j}')
        item.setEditable(False)
        item.setToolTip('hhh')
        item.setCheckable(True)
        parent.setChild(ii, 0, item)
        #parent.appendRow(item)

proxyModel = QtCore.QSortFilterProxyModel()
proxyModel.setFilterKeyColumn(-1)
proxyModel.setFilterRegularExpression("[0-2], [0-9]")
proxyModel.setSourceModel(model)

proxyModel.setRecursiveFilteringEnabled(True)



view1.setModel(proxyModel)
view2.setModel(model)

for row in range(model.rowCount()):
    for col in range(model.columnCount()):
        view2.expand(model.index(row, col))
        item = model.index(row, col)
        #item.flags(Qt.ItemIsUserCheckable)
        #view2.setFlags(item.flags() | Qt.ItemIsUserCheckable)

line = QtWidgets.QLineEdit()
button = QtWidgets.QPushButton("Отфильтровать")
button.clicked.connect(on_clicked)

hbox = QtWidgets.QHBoxLayout()
hbox.addWidget(line)
hbox.addWidget(button)

box = QtWidgets.QVBoxLayout()
box.addWidget(QtWidgets.QLabel("Промежуточная модель"))
box.addWidget(view1)
box.addLayout(hbox)
box.addWidget(QtWidgets.QLabel("Базовая модель"))
box.addWidget(view2)
window.setLayout(box)
window.show()
sys.exit(app.exec())

Подскажите пожалуйста, как заставить setAutoTristate работать?


Ответы (0 шт):