Почему не работает setAutoTristate
Мне нужно:
- отобразить данные в древовидной структуре
- эти данные фильтровать
- возможность ставить галочку на дочерние и родительские элементы
- если на родительский элемент поставить галочку, то галочка поставилась и на все дочерние элемены и наоборот. 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 работать?