from qtpy import QtWidgets, QtCore, QtGui
from qtpy.QtCore import QObject, Signal, QLocale
import sys
[docs]
class TreeLayout(QObject):
"""
qtpy class object based on QtreeWidget
The function populate_tree has to be used in order to populate the tree with structure as nested lists of dicts
"""
status_sig = Signal(str)
item_clicked_sig = Signal(object)
item_double_clicked_sig = Signal(object)
def __init__(self, parent=None, col_counts=1, labels=None):
super().__init__()
if parent is None:
parent = QtWidgets.QWidget()
self.parent = parent
self.setupUi()
self.tree.setColumnCount(col_counts)
if labels is not None:
self.tree.setHeaderLabels(labels)
self.open_tree_pb.clicked.connect(self.expand_all)
self.close_tree_pb.clicked.connect(self.collapse_all)
self.open_tree_selected_pb.clicked.connect(self.open_tree_selection)
self.tree.itemClicked.connect(lambda item, index: self.item_clicked_sig.emit(item))
self.tree.itemDoubleClicked.connect(lambda item, index: self.item_double_clicked_sig.emit(item))
def _current_text(self, col_index: int = 2):
return self.tree.currentItem().text(col_index)
[docs]
def current_node_path(self):
return self._current_text(2)
[docs]
def expand_all(self):
self.tree.expandAll()
[docs]
def collapse_all(self):
self.tree.collapseAll()
@property
def treewidget(self):
return self.tree
[docs]
def setupUi(self):
vlayout = QtWidgets.QVBoxLayout()
hlayout = QtWidgets.QHBoxLayout()
self.tree = CustomTree()
vlayout.addWidget(self.tree)
iconopen = QtGui.QIcon()
iconopen.addPixmap(QtGui.QPixmap("icons:tree.png"), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
self.open_tree_pb = QtWidgets.QPushButton('Open Tree')
self.open_tree_pb.setIcon(iconopen)
iconopensel = QtGui.QIcon()
iconopensel.addPixmap(QtGui.QPixmap("icons:tree.png"), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
self.open_tree_selected_pb = QtWidgets.QPushButton('Open Selected')
self.open_tree_selected_pb.setIcon(iconopensel)
iconclose = QtGui.QIcon()
iconclose.addPixmap(QtGui.QPixmap("icons:CollapseAll.png"), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
self.close_tree_pb = QtWidgets.QPushButton('Close Tree')
self.close_tree_pb.setIcon(iconclose)
hlayout.addWidget(self.open_tree_pb)
hlayout.addWidget(self.open_tree_selected_pb)
hlayout.addWidget(self.close_tree_pb)
vlayout.addLayout(hlayout)
self.parent.setLayout(vlayout)
[docs]
def open_tree_selection(self):
self.tree_open_children(self.tree.selectedIndexes()[0])
[docs]
def tree_open_children(self, item_index):
try:
if not (item_index.isValid()):
return
self.tree.expand(item_index)
except Exception as e:
self.status_sig.emit(str(e))
[docs]
def tree_open_parents(self, item_index):
try:
if not (item_index.isValid()):
return
flag = True
empty = QtCore.QModelIndex()
parent = item_index
while flag:
parent = parent.parent()
if parent != empty:
self.tree.expand(parent)
else:
flag = False
break
except Exception as e:
self.status_sig.emit(str(e))
[docs]
def populate_tree(self, data_dict):
try:
parents = []
for data in data_dict:
str_list = [str(data['name'])]
if 'filename' in data.keys():
str_list.append(data['filename'])
if 'info' in data.keys():
str_list.append(data['info'])
parent = QtWidgets.QTreeWidgetItem(str_list)
Items = self.populate_sub_tree(data['contents'])
parent.addChildren(Items)
parents.append(parent)
self.tree.addTopLevelItems(parents)
except Exception as e:
self.status_sig.emit(str(e))
[docs]
def populate_sub_tree(self, datas):
try:
parents = []
for data in datas:
str_list = [str(data['name'])]
if 'filename' in data.keys():
str_list.append(data['filename'])
if 'info' in data.keys():
str_list.append(data['info'])
parent = QtWidgets.QTreeWidgetItem(str_list)
if 'contents' in data.keys():
if type(data['contents']) == list:
Items = self.populate_sub_tree(data['contents'])
parent.addChildren(Items)
parents.append(parent)
return parents
except Exception as e:
self.status_sig.emit(str(e))
return parents
[docs]
class CustomTree(QtWidgets.QTreeWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
prog = TreeLayout(Form, col_counts=2, labels=["Material", "File"])
# example of actions to add to the tree widget in order to show a context menu
detector_action = QtWidgets.QAction("Grab from camera", None)
prog.tree.addAction(detector_action)
########################
Form.show()
data = [dict(name='papa', contents=[
dict(name='fiston', contents=[dict(name='subfiston', contents='baby', filename='Cest pas sorcier')]),
dict(name='fiston1', contents=[dict(name='subfiston', contents='baby', filename='Cest pas malin')]),
dict(name='fiston2', contents=[dict(name='subfiston', contents='baby', filename='Cest pas normal')])]),
dict(name='maman', contents=[dict(name='fistone', contents=[dict(name='subfistone', contents='baby')])])]
prog.populate_tree(data)
# filename='C:\\Data\\2019\\20190220\\Dataset_20190220_004\\Dataset_20190220_004.h5'
# import tables
# h5_file = tables.open_file(filename, mode = "a")
# for node in h5_file.walk_nodes():
# print(node)
# base_node = h5_file.root
# base_tree_item, pixmap_items = h5tree_to_QTree(h5_file, base_node)
# prog.ui.Tree.addTopLevelItem(base_tree_item)
sys.exit(app.exec_())