class MainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle('Direct tree') self.model = QFileSystemModel() self.model.setRootPath(QDir.rootPath()) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(os.getcwd())) self.tree.doubleClicked.connect(self._on_double_clicked) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.textEdit = QTextEdit() self.textEdit.setReadOnly(True) splitter = QSplitter() splitter.addWidget(self.tree) splitter.addWidget(self.textEdit) splitter.setSizes([50, 200]) self.setCentralWidget(splitter) def _on_double_clicked(self, index): file_name = self.model.filePath(index) with open(file_name, encoding='utf-8') as f: text = f.read() self.textEdit.setPlainText(text)
class Explorer(object): ''' classdocs ''' def __init__(self): ''' Constructor ''' root = Container("Root") model = root.add(Model("Model")) test = model.add(Container("test")) cns = model.add(Model("Cns")) root2 = root.add(Container("Model 2")) leg = root2.add(Container("Leg")) bones = Model("Fk") leg.add(bones) bones.transform.scale.y.constrainer = cns.transform.scale.y cns.transform.scale = Vector(2, 3, 4) self.model = SceneGraphModel(root) self.view = QTreeView() self.view.setDragEnabled(True) self.view.setAcceptDrops(True) self.view.setDropIndicatorShown(True) self.view.setSelectionMode(QAbstractItemView.ExtendedSelection) self.view.setModel(self.model) self.objEditor = Obj3dEditor() self.objEditor.setModel(self.model) self.transformEditor = TransformEditor() self.transformEditor.setModel(self.model) self.view.selectionModel().currentChanged.connect(self.setSelection) self.view.setStyleSheet(""" .QTreeView { background-color:rgb(61, 63, 65); color: #bbb; font-size : 12px; } .QHeaderView::section { height: 20px; font-size : 12px; background-color: rgb(65, 74, 91); color: #bbb; border: 1px solid rgba(20, 24, 24,0); } """) def setSelection(self, current, old): self.objEditor.setSelection(current, old) self.transformEditor.setSelection(current, old) def show(self): self.view.show()
class ItemList(QWidget): _ITEM_NAME, _OPERATIONS = range(2) def __init__(self): super().__init__() self.app_state = AppState() self.app_state.addAddItemListener(self._addItemListener) self.model = QStandardItemModel() self.model.setHeaderData(self._ITEM_NAME, Qt.Horizontal, "Name") self.model.setHeaderData(self._OPERATIONS, Qt.Horizontal, "Operations") self.model.itemChanged.connect(self._renameListener) self.initUI() def initUI(self): grid = QGridLayout() self.setLayout(grid) self.tree_view = QTreeView() self.tree_view.setModel(self.model) self.tree_view.clicked.connect(self._selectedItemListener) grid.addWidget(self.tree_view, 0, 0, 19, 1) self.load_data_button = QPushButton('Load Data') self.load_data_button.clicked.connect(self._loadDatauttonListener) grid.addWidget(self.load_data_button, 20, 0, 1, 1) #Private def _getItemKey(self, item): return self.model.itemData(item)[257] #Event Handlers def _selectedItemListener(self, event): key = self._getItemKey(self.tree_view.currentIndex()) self.app_state.setCurrentItem(key) def _loadDatauttonListener(self): file_path, file_types = QFileDialog.getOpenFileName( self, 'Open file', os.path.expanduser("~")) if (len(file_path) <= 0): return item_data = Loader.load(file_path) self.app_state.addItem(item_data) #Called when a new item is added to the AppState def _addItemListener(self, key, item_data): item = QStandardItem(item_data.name) item.setData(key) # Set my custom index as a payload item.setSelectable(True) item.setEditable(True) self.model.appendRow(item) def _renameListener(self, item): key = item.data() self.app_state.renameItemAt(key, item.text())
class Widget(QWidget): def __init__(self): super().__init__() path = QDir.rootPath() self.model = QFileSystemModel() self.model.setRootPath(path) self.tree_view = QTreeView() self.tree_view.setModel(self.model) self.tree_view.setSelectionMode(QTreeView.ExtendedSelection) self.tree_view.selectionModel().selectionChanged.connect( self._on_selection_changed) self.list_files = QListWidget() self.button_add = QPushButton('Добавить!') self.button_add.setEnabled(False) self.button_add.clicked.connect(self._on_add) splitter = QSplitter(Qt.Horizontal) splitter.addWidget(self.tree_view) splitter.addWidget(self.list_files) main_layout = QVBoxLayout(self) main_layout.addWidget(splitter) main_layout.addWidget(self.button_add) def _on_selection_changed(self, selected, deselected): has = self.tree_view.selectionModel().hasSelection() self.button_add.setEnabled(has) def _on_add(self): for row in self.tree_view.selectionModel().selectedRows(): path = self.model.filePath(row) self.list_files.addItem(path)
class ShortcutConfig(QWidget): # {{{ changed_signal = pyqtSignal() def __init__(self, parent=None): QWidget.__init__(self, parent) self._layout = l = QVBoxLayout(self) self.header = QLabel( _('Double click on any entry to change the' ' keyboard shortcuts associated with it')) l.addWidget(self.header) self.view = QTreeView(self) self.view.setAlternatingRowColors(True) self.view.setHeaderHidden(True) self.view.setAnimated(True) l.addWidget(self.view) self.delegate = Delegate() self.view.setItemDelegate(self.delegate) self.delegate.sizeHintChanged.connect( self.editor_opened, type=Qt.ConnectionType.QueuedConnection) self.delegate.changed_signal.connect(self.changed_signal) self.search = SearchBox2(self) self.search.initialize('shortcuts_search_history', help_text=_('Search for a shortcut by name')) self.search.search.connect(self.find) self._h = h = QHBoxLayout() l.addLayout(h) h.addWidget(self.search) self.nb = QPushButton(QIcon(I('arrow-down.png')), _('&Next'), self) self.pb = QPushButton(QIcon(I('arrow-up.png')), _('&Previous'), self) self.nb.clicked.connect(self.find_next) self.pb.clicked.connect(self.find_previous) h.addWidget(self.nb), h.addWidget(self.pb) h.setStretch(0, 100) def restore_defaults(self): self._model.restore_defaults() self.changed_signal.emit() def commit(self): if self.view.state() == self.view.EditingState: self.delegate.accept_changes() self._model.commit() def initialize(self, keyboard): self._model = ConfigModel(keyboard, parent=self) self.view.setModel(self._model) def editor_opened(self, index): self.view.scrollTo(index, self.view.EnsureVisible) @property def is_editing(self): return self.view.state() == self.view.EditingState def find(self, query): if not query: return try: idx = self._model.find(query) except ParseException: self.search.search_done(False) return self.search.search_done(True) if not idx.isValid(): info_dialog(self, _('No matches'), _('Could not find any shortcuts matching %s') % query, show=True, show_copy_button=False) return self.highlight_index(idx) def highlight_index(self, idx): self.view.scrollTo(idx) self.view.selectionModel().select( idx, self.view.selectionModel().ClearAndSelect) self.view.setCurrentIndex(idx) self.view.setFocus(Qt.FocusReason.OtherFocusReason) def find_next(self, *args): idx = self.view.currentIndex() if not idx.isValid(): idx = self._model.index(0, 0) idx = self._model.find_next(idx, unicode_type(self.search.currentText())) self.highlight_index(idx) def find_previous(self, *args): idx = self.view.currentIndex() if not idx.isValid(): idx = self._model.index(0, 0) idx = self._model.find_next(idx, unicode_type(self.search.currentText()), backwards=True) self.highlight_index(idx) def highlight_group(self, group_name): idx = self.view.model().index_for_group(group_name) if idx is not None: self.view.expand(idx) self.view.scrollTo(idx, self.view.PositionAtTop) self.view.selectionModel().select( idx, self.view.selectionModel().ClearAndSelect) self.view.setCurrentIndex(idx) self.view.setFocus(Qt.FocusReason.OtherFocusReason)
class ShortcutConfig(QWidget): # {{{ changed_signal = pyqtSignal() def __init__(self, parent=None): QWidget.__init__(self, parent) self._layout = l = QGridLayout() self.setLayout(self._layout) self.header = QLabel(_('Double click on any entry to change the' ' keyboard shortcuts associated with it')) l.addWidget(self.header, 0, 0, 1, 3) self.view = QTreeView(self) self.view.setAlternatingRowColors(True) self.view.setHeaderHidden(True) self.view.setAnimated(True) l.addWidget(self.view, 1, 0, 1, 3) self.delegate = Delegate() self.view.setItemDelegate(self.delegate) self.delegate.sizeHintChanged.connect(self.editor_opened, type=Qt.QueuedConnection) self.delegate.changed_signal.connect(self.changed_signal) self.search = SearchBox2(self) self.search.initialize('shortcuts_search_history', help_text=_('Search for a shortcut by name')) self.search.search.connect(self.find) l.addWidget(self.search, 2, 0, 1, 1) self.nb = QPushButton(QIcon(I('arrow-down.png')), _('&Next'), self) self.pb = QPushButton(QIcon(I('arrow-up.png')), _('&Previous'), self) self.nb.clicked.connect(self.find_next) self.pb.clicked.connect(self.find_previous) l.addWidget(self.nb, 2, 1, 1, 1) l.addWidget(self.pb, 2, 2, 1, 1) l.setColumnStretch(0, 100) def restore_defaults(self): self._model.restore_defaults() self.changed_signal.emit() def commit(self): if self.view.state() == self.view.EditingState: self.delegate.accept_changes() self._model.commit() def initialize(self, keyboard): self._model = ConfigModel(keyboard, parent=self) self.view.setModel(self._model) def editor_opened(self, index): self.view.scrollTo(index, self.view.EnsureVisible) @property def is_editing(self): return self.view.state() == self.view.EditingState def find(self, query): if not query: return try: idx = self._model.find(query) except ParseException: self.search.search_done(False) return self.search.search_done(True) if not idx.isValid(): info_dialog(self, _('No matches'), _('Could not find any shortcuts matching %s')%query, show=True, show_copy_button=False) return self.highlight_index(idx) def highlight_index(self, idx): self.view.scrollTo(idx) self.view.selectionModel().select(idx, self.view.selectionModel().ClearAndSelect) self.view.setCurrentIndex(idx) self.view.setFocus(Qt.OtherFocusReason) def find_next(self, *args): idx = self.view.currentIndex() if not idx.isValid(): idx = self._model.index(0, 0) idx = self._model.find_next(idx, unicode(self.search.currentText())) self.highlight_index(idx) def find_previous(self, *args): idx = self.view.currentIndex() if not idx.isValid(): idx = self._model.index(0, 0) idx = self._model.find_next(idx, unicode(self.search.currentText()), backwards=True) self.highlight_index(idx) def highlight_group(self, group_name): idx = self.view.model().index_for_group(group_name) if idx is not None: self.view.expand(idx) self.view.scrollTo(idx, self.view.PositionAtTop) self.view.selectionModel().select(idx, self.view.selectionModel().ClearAndSelect) self.view.setCurrentIndex(idx) self.view.setFocus(Qt.OtherFocusReason)
def setModel(self, model): QTreeView.setModel(self, model) model.auto_expand_nodes.connect( self.auto_expand_indices, type=Qt.ConnectionType.QueuedConnection)
class Navigation(QWidget): """a navigation widget, displaying all known projects and samples """ changed_projects = pyqtSignal(str, str) changed_allele = pyqtSignal(str, int, str) change_view = pyqtSignal(int) refresh = pyqtSignal(str) def __init__(self, log, settings): self.log = log self.settings = settings super().__init__() self.init_UI() self.create_model() self.tree.expand(self.open_node) self.tree.clicked.connect(self.onClicked) self.tree.setContextMenuPolicy(Qt.CustomContextMenu) self.tree.customContextMenuRequested.connect(self.open_menu) def init_UI(self): """creates the UI """ self.log.debug("Setting up Navigation area UI...") self.tree = QTreeView() self.tree.doubleClicked.connect(self.onDoubleClick) self.grid = QGridLayout() self.setLayout(self.grid) self.header_lbl = QLabel("Projects and Samples:", self) self.header_lbl.setStyleSheet(general.label_style_2nd) self.grid.addWidget(self.header_lbl, 0,0) self.grid.addWidget(self.tree, 1, 0) header = self.tree.header() header.hide() self.log.debug("\t=> Done!") def create_model(self): """creates or recreates the model """ self.log.debug("Updating Navigation area...") root_node = Node("All") openNode = Node("Open", root_node) closedNode = Node("Closed", root_node) project_nodes = {} query = """select distinct sample_id_int, projects.project_name, project_status, allele_status, allele_nr from projects left join alleles on projects.project_name = alleles.project_name order by project_status desc, projects.project_name desc, sample_id_int """ q = QtSql.QSqlQuery() q.exec_(query) while q.next(): sample = q.value(0) project = q.value(1) pstatus = q.value(2) astatus = q.value(3) nr = q.value(4) try: pnode = project_nodes[project] except KeyError: if pstatus == "Closed": topnode = closedNode else: topnode = openNode pnode = Node(project, topnode, "Project") project_nodes[project] = pnode if sample: if nr != 1: sample = "{} ({})".format(sample, nr) Node(sample, pnode, "Sample", astatus) self.model = NavigationModel(root_node) self.tree.setModel(self.model) self.open_node = self.model.index(0, 0, QModelIndex()) self.closed_node = self.model.index(1, 0, QModelIndex()) self.root_node = self.open_node.parent() self.log.debug("\t=> Done!") @pyqtSlot(str, str) def expand_project(self, project, status = None): """expands the node of the given project, returns its index and parent-node's index """ self.log.debug("Expanding project {} ({})...".format(project, status)) if not status in (None, "Open", "Closed"): return None, None myindex = self.open_node myparent_node = self.open_node if status == "Open": self.log.debug("Open") parent_node = self.open_node self.tree.expand(parent_node) self.tree.collapse(self.closed_node) elif status == "Closed": self.log.debug("Closed") parent_node = self.closed_node self.tree.expand(parent_node) self.tree.collapse(self.open_node) else: # figure out whether project is open or closed self.log.debug("Status unknown...") try: for i in range(self.model.rowCount(self.root_node)): parent_node = self.model.index(i, 0, self.root_node) status = self.model.data(parent_node, Qt.DisplayRole) for row in range(self.model.rowCount(parent_node)): index = self.model.index(row, 0, parent_node) myproj = self.model.data(index, Qt.DisplayRole) if myproj == project: myindex = index myparent_node = parent_node self.tree.expand(myindex) except Exception as E: self.log.error(E) self.log.exception(E) self.select_project(project) self.log.debug("\t=> project found ({}) and successfully expanded".format(status)) return myindex, myparent_node @pyqtSlot(QModelIndex) def onClicked(self, index): """emits signals when a project or sample is selected """ data = self.model.data(index, Qt.DisplayRole) nodetype = self.model.nodeType(index) if nodetype == "Sample": if ("(") in data: data = data.split("(") sample = data[0].strip() nr = int(data[1].strip()[:-1]) else: sample = data nr = 1 project = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_allele.emit(sample, nr, project) self.log.debug("Navigation emitted 'Allele changed to {} #{} (project {})'".format(sample, nr, project)) elif nodetype == "Project": status = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_projects.emit(data, status) self.log.debug("Navigation emitted 'Project changed to {}'".format(data)) @pyqtSlot(QPoint) def open_menu(self, pos): """provides a context menu """ index = self.tree.indexAt(pos) nodetype = self.model.nodeType(index) self.log.debug("Opening navigation menu...") if nodetype == "Project": menu = QMenu() open_project_act = menu.addAction("Open Project View") action = menu.exec_(self.tree.mapToGlobal(pos)) if action == open_project_act: project = self.model.data(index, Qt.DisplayRole) status = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_projects.emit(project, status) self.change_view.emit(3) self.log.debug("Navigation emitted changed_projects & change_view to ProjectView") elif nodetype == "Sample": menu = QMenu() open_sample_act = menu.addAction("Open Sample View") delete_sample_act = menu.addAction("Delete Allele (admin-only!)") action = menu.exec_(self.tree.mapToGlobal(pos)) if action: sample_list = self.model.data(index, Qt.DisplayRole).split() sample = sample_list[0] if len(sample_list) > 1: nr = int(sample_list[1][1:-1]) else: nr = 1 project = self.model.data(self.model.parent(index), Qt.DisplayRole) status = self.model.data(self.model.parent(self.model.parent(index)), Qt.DisplayRole) if action == open_sample_act: try: self.changed_allele.emit(sample, nr, project) self.change_view.emit(4) self.log.debug("Navigation emitted changed_alleles & change_view to AlleleView") except Exception as E: self.log.exception(E) elif action == delete_sample_act: self.log.info("Deleting {} #{} of project {}".format(sample, nr, project)) self.delete_sample(sample, nr, project, status) @pyqtSlot(QModelIndex) def onDoubleClick(self, index): """open SampleView or ProjectView """ nodetype = self.model.nodeType(index) if nodetype == "Project": project = self.model.data(index, Qt.DisplayRole) status = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_projects.emit(project, status) self.change_view.emit(3) self.log.debug("Navigation emitted changed_projects & change_view to ProjectView") elif nodetype == "Sample": sample_list = self.model.data(index, Qt.DisplayRole).split() sample = sample_list[0] if len(sample_list) > 1: nr = int(sample_list[1][1:-1]) else: nr = 1 project = self.model.data(self.model.parent(index), Qt.DisplayRole) status = self.model.data(self.model.parent(self.model.parent(index)), Qt.DisplayRole) self.changed_allele.emit(sample, nr, project) self.change_view.emit(4) self.log.debug("Navigation emitted changed_alleles & change_view to AlleleView") @pyqtSlot(str) def select_project(self, project): """looks for <project> in the tree-model and selects it if found; selects it and returns its index """ for top_node in [self.open_node, self.closed_node]: index = self.model.findValue(top_node, project) if index.isValid(): self.tree.setCurrentIndex(index) return index return QModelIndex() @pyqtSlot(str) def select_sample(self, project, sample, nr): """looks for <sample> in <project> in the tree-model and selects it if found; selects it and returns its index """ pindex = self.select_project(project) if int(nr) > 1: sample = "{} ({})".format(sample, nr) index = self.model.findValue(pindex, sample) if index.isValid(): self.tree.setCurrentIndex(index) return index return QModelIndex() def delete_sample(self, sample, nr, project, status): """delete a sample from the database & file system """ self.log.debug("Attempting to delete sample '{}' allele {} of project '{}' from database...".format(sample, nr, project)) if self.settings["login"] == "admin": pass else: pwd, ok = QInputDialog.getText(self, "Enter Password", "Please provide password:"******"ichdarfdas": pass else: return else: return self.log.debug("Asking for confirmation before deleting allele...") reply = QMessageBox.question(self, 'Message', "Are you really sure you want to delete sample {} allele #{} from project {}?".format(sample, nr, project), QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: # delete from database: delete_q_alleles = "delete from alleles where sample_id_int = '{}' and allele_nr = {} and project_name = '{}'".format(sample, nr, project) success, _ = db_internal.execute_query(delete_q_alleles, 0, self.log, "Deleting sample {} allele #{} from ALLELES table".format(sample, nr), "Sample Deletion Error", self) if success: self.log.debug("\t=> Successfully deleted sample from table ALLELES") more_projects_query = "select project_name from alleles where sample_id_int = '{}'".format(sample) success, data = db_internal.execute_query(more_projects_query, 1, self.log, "Finding more rows with sample {} in ALLELES table".format(sample), "Sample Deletion Error", self) single_allele = False if success: if not data: # sample was only contained in this project and only had one allele single_allele = True delete_q_samples = "delete from SAMPLES where sample_id_int = '{}'".format(sample) success, _ = db_internal.execute_query(delete_q_samples, 0, self.log, "Deleting sample {} from SAMPLES table".format(sample), "Sample Deletion Error", self) if success: self.log.debug("\t=> Successfully deleted sample from table SAMPLES") files_q = "select raw_file, fasta, blast_xml, ena_file, ena_response_file, ipd_submission_file from FILES where sample_id_int = '{}' and allele_nr = {}".format(sample, nr) success, files = db_internal.execute_query(files_q, 6, self.log, "Getting files of sample {} #{} from FILES table".format(sample, nr), "Sample Deletion Error", self) if success: delete_q_files = "delete from FILES where sample_id_int = '{}' and allele_nr = {}".format(sample, nr) success, _ = db_internal.execute_query(delete_q_files, 0, self.log, "Deleting sample {} from FILES table".format(sample), "Sample Deletion Error", self) if success: self.log.debug("\t=> Successfully deleted sample from table FILES") # delete from disk space: self.log.debug("Attempting to delete sample {} allele #{} of project '{}' from file system...".format(sample, nr, project)) sample_dir = os.path.join(self.settings["projects_dir"], project, sample) if files: for myfile in files[0]: if myfile: self.log.debug("\tDeleting {}...".format(myfile)) try: os.remove(os.path.join(sample_dir, myfile)) except Exception: self.log.debug("\t\t=> Could not delete") if single_allele: self.log.debug("\tDeleting sample dir {}...".format(sample_dir)) os.removedirs(sample_dir) self.log.debug("=> Sample {} #{} of project {} successfully deleted from database and file system".format(sample, nr, project)) self.refresh.emit(project) self.changed_projects.emit(project, status)
def setModel(self, model): QTreeView.setModel(self, model) model.current_toc_nodes_changed.connect( self.current_toc_nodes_changed, type=Qt.ConnectionType.QueuedConnection)
class BookWarriorHomepage ( QWidget,Ui_BookWarriorHomepage): updateSelection = pyqtSignal() def __init__ (self,model,parent=None): super(BookWarriorHomepage,self).__init__(parent) self.setupUi(self) self.max_vignettes = 20 self.nb_col = 0 self.nb_row = 0 self.vignettes_liste = [] self.model = model self.settings = Config().instance.settings self.list_warrior = [] # utilise pour maj selection depuis warrrior layout def setLeftPage(self): self.treeView = QTreeView(self) self.treeView.setObjectName("treeView") self.left_page_Layout.addWidget(self.treeView) self.treeView.activated.connect(self.changeCurrentSet) self.tree_model = TreeModel(self.model) self.treeView.setModel(self.tree_model) self.treeView.setWindowTitle("Simple Tree Model") self.treeView.header().hide() self.treeView.setAlternatingRowColors(True) # i = 0 # self.treeKingdom.setColumnCount(3) # for faction in self.model.factions.values() : # item_f = QTreeWidgetItem(self.treeKingdom) # #self.treeKingdom.insertTopLevelItem(i,item_f) # item_f.setText(i,faction.name) # i = i +1 # for empire in faction.empires.values(): # item_e = QTreeWidgetItem() # item_e.setText(i,empire.name) # item_f.addChild(item_e) # for kingdom in empire.kingdoms.values(): # item_k = QTreeWidgetItem() # item_k.setText(i,kingdom.name) # item_e.addChild(item_k) # for groupe in kingdom.groupes.values(): # item_g = QTreeWidgetItem() # item_g.setText(i,groupe.name) # print ('groupe',groupe.name) # item_k.addChild(item_g) def setRightContent (self, list_warrior): self.list_warrior = list_warrior for v in self.vignettes_liste : v.setParent(None) self.gridLayout.removeWidget(v) # while self.gridLayout.takeAt(0) != None : # del self.gridLayout.takeAt(0).widget # item = self.gridLayout.takeAt(0) # print ('ll') # del item self.nb_col = 0 self.nb_row = 0 self.vignettes_liste = [] for i in range (min(len(list_warrior),self.max_vignettes)): self.addVignette(list_warrior[i],i) def updateContent(self): pass def addVignette (self,warrior,i): widget_vignette = QWidget(self.vignettes) layout_one_vignette = QVBoxLayout(widget_vignette) layout_one_vignette.setSpacing(0) layout_one_vignette.setContentsMargins(0, 0, 0, 0) warrior_button = QPushButton(widget_vignette) # on met plus car dans le cas du signal clicked on enverra True ou False (0 ou 1) warrior_button.setObjectName(str(i+2)) warrior_button.clicked.connect(self.parent().goWarriorPage) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) warrior_button.setFixedSize(QtCore.QSize(100,120)) warrior_button.setSizePolicy(sizePolicy) layout_one_vignette.addWidget(warrior_button) # label warrior_label = HerosLabel(warrior,widget_vignette) layout_one_vignette.addWidget(warrior_label) max_col = 3 groupe_name = warrior.groupe().name if warrior.masterGroupe() != None : groupe_name = warrior.masterGroupe().name+"/"+groupe_name #path = os.path.join(Config().instance.path_to_pic(),faction_name,empire_name,kingdom_name,"Picture",groupe_name,warrior_name icon = QIcon(warrior.thumb) #print (basepath+"/"+faction_name+"/"+empire_name+"/"+kingdom_name+"/Picture/"+groupe_name+"/"+warrior.name+"/portrait_thumbnail.jpg") warrior_button.setIcon(icon) warrior_button.setIconSize(QtCore.QSize(100,120)) if self.nb_col == 0: self.nb_row = self.nb_row + 1 self.gridLayout.addWidget(widget_vignette,self.nb_row,self.nb_col) self.vignettes_liste.append(widget_vignette) self.nb_col = (self.nb_col +1)%max_col def changeCurrentSet(self,index): print ('changecurrentset:') item = self.tree_model.metadata(index, QtCore.Qt.DecorationRole) list_warrior = item.getWarriorList() self.setRightContent(list_warrior) self.updateSelection.emit()