''' ''' from PyQt5 import uic from PyQt5.Qt import Qt, QEvent, QGraphicsScene, QPointF, QFileDialog, \ QApplication, QMessageBox, QTreeWidgetItem, \ QGraphicsTextItem from PyQt5.QtWidgets import QMainWindow, QGraphicsView from path import Path import core Ui_window, _ = uic.loadUiType(Path(__file__).parent / 'qt_viewer.ui') class GraphicsObject(QGraphicsTextItem): def __init__(self, obj, parent=None, scene=None): self.obj = obj super(GraphicsObject, self).__init__("...", parent=parent) self.setHtml("{}".format(obj.nom)) self.setTextWidth(200) class Viewer(QMainWindow): def __init__(self): super (Viewer, self).__init__() self.createWidgets() # ## UI related methods def createWidgets(self): self.ui = Ui_window() self.ui.setupUi(self) self.ui.progressBar.setVisible(False) self.ui.stackedWidget.setCurrentIndex(0) self.ui.btn_select.clicked.connect(self.run) self.ui.btn_zoom_plus.clicked.connect(self.zoom_plus) self.ui.btn_zoom_minus.clicked.connect(self.zoom_minus) self.ui.btn_zoom_view.clicked.connect(self.fit_in_view) self.ui.treeWidget.itemClicked.connect(self.itemSelected) core.Analyse.report = self.update_progression self.ui.view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate) self.ui.view.setDragMode(QGraphicsView.NoDrag) self.ui.view.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) self.ui.view.viewport().installEventFilter(self) self._scene = QGraphicsScene() self._scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex) self.ui.view.setScene(self._scene) self.ui.view.centerOn(QPointF(0, 0)) self.fit_in_view() def eventFilter(self, obj, event): if event.type() == QEvent.Wheel: if event.angleDelta().y() > 0: self.zoom_plus() elif event.angleDelta().y() < 0: self.zoom_minus() return True return False def fit_in_view(self): self.ui.view.fitInView(self._scene.sceneRect(), Qt.KeepAspectRatio) def zoom_plus(self): self.ui.view.scale(1.2, 1.2) def zoom_minus(self): self.ui.view.scale(0.8, 0.8) def update_progression(self, i, total, msg=""): self.ui.progressBar.setMaximum(total) self.ui.progressBar.setValue(i) if msg: self.ui.txtPanel.append(msg) QApplication.processEvents() def run(self): # source_dir = QFileDialog.getExistingDirectory(self, "Sélectionner le répertoire des sources", "", QFileDialog.ShowDirsOnly) source_dir = r"C:\dev\access\AGRHum\source" self.ui.progressBar.setVisible(True) self.ui.lbl_repertoire.setText(source_dir) self.ui.txtPanel.clear() self.ui.treeWidget.clear() QApplication.setOverrideCursor(Qt.WaitCursor) core.Analyse.run(source_dir) QApplication.restoreOverrideCursor() QMessageBox.information(self, "test", "{} objets chargés".format(len(core.Analyse.objects))) self.ui.progressBar.setVisible(False) self.ui.stackedWidget.setCurrentIndex(1) self.ui.txtPanel.clear() topitem = QTreeWidgetItem() topitem.setText(0, "Objets") self.ui.treeWidget.addTopLevelItem(topitem) groupes = {} for index, obj in enumerate(core.Analyse.objects): if not obj.type_ in groupes: item = QTreeWidgetItem() item.setText(0, obj.type_) groupes[obj.type_] = item topitem.addChild(item) item = QTreeWidgetItem() item.setText(0, obj.nom) item.setData(1, 0, index) groupes[obj.type_].addChild(item) self.ui.treeWidget.setColumnHidden(1, True) self.ui.treeWidget.expandToDepth(1) def itemSelected(self, item): index = item.data(1, 0) obj = core.Analyse.objects[index] go = GraphicsObject(obj) self._scene.addItem(go)