def tableWidget_right_click_remove_event(self): index_list = [] for model_index in self.tableWidget.selectionModel().selectedRows(): index = QPersistentModelIndex(model_index) index_list.append(index) for index in index_list: # first, remove data if it is in enabled_list if self.data_list[index.row()] in self.enabled_list: self.enabled_list.remove(self.data_list[index.row()]) self.remove(index.row()) #remove internal data in list self.tableWidget.removeRow(index.row()) #remove gui print(self.data_list)
class TableWidget(QTableWidget): cellExited = pyqtSignal(int, int) itemExited = pyqtSignal(QTableWidgetItem) released = pyqtSignal(QMouseEvent) def __init__(self, rows, columns, parent=None): QTableWidget.__init__(self, rows, columns, parent) self._last_index = QPersistentModelIndex() self.viewport().installEventFilter(self) def mouseReleaseEvent(self, event: QMouseEvent): event.accept() if event.button() == 1: self.released.emit(event) def eventFilter(self, widget, event): if widget is self.viewport(): index = self._last_index if event.type() == QEvent.MouseMove: index = self.indexAt(event.pos()) elif event.type() == QEvent.Leave: index = QModelIndex() if index != self._last_index: row = self._last_index.row() column = self._last_index.column() item = self.item(row, column) if item is not None: self.itemExited.emit(item) self.cellExited.emit(row, column) self._last_index = QPersistentModelIndex(index) return QTableWidget.eventFilter(self, widget, event)
def slot_deleteItems(self, group=None): '''delete items by group if group is not empty, otherwise delete selected items''' # collect indexes to be removed indexes = [] if group: for i in range(self.sourceModel.rowCount()): index = self.sourceModel.index(i, ItemModel.GROUP) if index.data() == group: indexes.append(index) else: for proxy_index in self.selectionModel().selectedRows( ): # proxy index source_index = self.proxyModel.mapToSource(proxy_index) index = QPersistentModelIndex(source_index) indexes.append(index) # request confirm reply = QMessageBox.question( self, 'Confirm', "Confirm to remove the selected {0} item(s)? Items deleted by this operation can not be restored." .format(len(indexes)), QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply != QMessageBox.Yes: return # delete for index in indexes[::-1]: self.sourceModel.removeRow(index.row()) # emit signal to request updating group/tag counter if indexes: self.itemsChanged.emit(self.sourceModel.serialize(save=False))
def enable_checkbox_clicked(self): print("enable_checkbox_clicked") index_list = [] for model_index in self.tableWidget.selectionModel().selectedRows(): index = QPersistentModelIndex(model_index) index_list.append(index) for index in index_list: print(index.row()) print(self.data_list[index.row()]["use"]) if(self.data_list[index.row()]["use"] == "False"): print("enabled_list append") self.data_list[index.row()]["use"] = "True" self.enabled_list.append(self.data_list[index.row()]) else: print("enabled_list remove!") self.data_list[index.row()]["use"] = "False" print("enabled_length") print(len(self.enabled_list)) for count in range(0, len(self.enabled_list)): if self.enabled_list[count]['idx'] == self.data_list[index.row()]['idx']: print("delete enabled_list") del self.enabled_list[count] break print("enabled_list: ") print(self.enabled_list)
def _delete(self): index_list = [] for model_index in self.tableView.selectionModel().selectedRows(): index = QPersistentModelIndex(model_index) index_list.append(index) for index in index_list: self.model.removeRow(index.row()) self._remove_project_from_config(index.data()) if index_list: self.dirty = True
def test_model_persistent_index(model_test): ''' ☑ 🛇 read-only.ro ☑ ★ user.json ☑ ⎕ commands.json ☐ 🛇 asset:plover:assets/main.json ''' persistent_index = QPersistentModelIndex(model_test.model.index(1)) assert persistent_index.row() == 1 assert persistent_index.data(Qt.CheckStateRole) == Qt.Checked assert persistent_index.data(Qt.DecorationRole) == 'favorite' assert persistent_index.data(Qt.DisplayRole) == 'user.json' model_test.configure(classic_dictionaries_display_order=True) assert persistent_index.row() == 2 assert persistent_index.data(Qt.CheckStateRole) == Qt.Checked assert persistent_index.data(Qt.DecorationRole) == 'favorite' assert persistent_index.data(Qt.DisplayRole) == 'user.json' model_test.model.setData(persistent_index, Qt.Unchecked, Qt.CheckStateRole) assert persistent_index.row() == 2 assert persistent_index.data(Qt.CheckStateRole) == Qt.Unchecked assert persistent_index.data(Qt.DecorationRole) == 'normal' assert persistent_index.data(Qt.DisplayRole) == 'user.json'
def btn_removeBtn_clicked(self): index_list = [] selModel = self.tbl_address.selectionModel() if selModel is None: return if len(selModel.selectedRows()) < 1: return for model_index in selModel.selectedRows(): index = QPersistentModelIndex(model_index) index_list.append(index) oldrow = index.row() for index in index_list: self.model.removeRows(index.row(), 1, 0) if self.model.rowCount(QModelIndex()) == 1: next_index = self.model.index(0, 0) else: next_index = self.model.index(oldrow, 0) # next_index = self.model.index(self.model.rowCount(QModelIndex()) - 1, 0) selModel.select( next_index, QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows) self.tbl_address.setFocus()
def removeBtn_clicked(self): # selRows = self.tableView.selectionModel().selectedRows() rows = sorted(set(index.row() for index in self.tableView.selectedIndexes()), reverse=True) index_list = [] for model_index in self.tableView.selectionModel().selectedRows(): index = QPersistentModelIndex(model_index) index_list.append(index) for index in index_list: self.tableView.model().removeRows(index.row(), 1, 0) next_index = self.tableView.model().index(self.tableView.model().rowCount(QModelIndex()) - 1, 0) # self.tableView.setCurrentIndex(next_index) self.tableView.selectionModel().select(next_index, QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows) self.tableView.setFocus()
def tab_remove(tab): tab.blockSignals(True) #index = tab.selectionModel().selectedRows() #if len(index)>0: # for i in range(0,len(index)): # pos=index[i].row() # tab.removeRow(pos) index_list = [] for model_index in tab.selectionModel().selectedRows(): index = QPersistentModelIndex(model_index) index_list.append(index) for index in index_list: tab.removeRow(index.row()) tab.blockSignals(False)
def delete_rows(self): index_list = [] if self.tbvExtratacao.model() is not None: for model_index in self.tbvExtratacao.selectionModel().selectedRows(): index = QPersistentModelIndex(model_index) index_list.append(index) # print(f'Before delete_rows():\tself.df.shape(): {self.tbvExtratacao.model()._data.shape}') for index in index_list: self.tbvExtratacao.model().layoutAboutToBeChanged.emit() self.tbvExtratacao.model().removeRow(index.row()) self.tbvExtratacao.model().layoutChanged.emit() self.tbvExtratacao.model()._data = self.tbvExtratacao.model()._data.drop([int(index.row())], axis=0) # print(f'After delete_rows():\tself.df.shape(): {self.tbvExtratacao.model()._data.shape}') if self.tbvExtratacao.model() is not None: dfProcess = self.tbvExtratacao.model()._data.reset_index(level=0, drop=True) """Preenche a TableView""" self.carrega_tableview(dfProcess) return
def myDropEvent(self, event, drop_item): """Workaround for broken QTreeWidget::dropEvent per https://bugreports.qt.io/browse/QTBUG-45320 doing reverse ordering of items on dropping. reimplementation in python from C++ For this code we need dual GPL3 license instead of pure BSD3 """ if event.source() == self and (event.dropAction() == Qt.MoveAction or self.dragDropMode() == QAbstractItemView.InternalMove): droptuple = self.dropOn(event, drop_item) if droptuple is not None: (row, col, drop_index) = droptuple # print("droptuple", droptuple[2].row()) idxs = self.selectedIndexes() indexes = [] for idx in idxs: if idx.column() == 0: indexes.append(idx) if drop_index in indexes: return # When removing items the drop location could shift new_drop_index = QPersistentModelIndex(self.model().index( row, col, drop_index)) # print("updatated drop_row", new_drop_index.row()) # Remove the items taken = [] for i in range(len(indexes) - 1, -1, -1): # print("idx", indexes[i].row(), indexes[i].column()) parent = self.itemFromIndex(indexes[i]) if parent is None or parent.parent() is None: t_item = self.takeTopLevelItem(indexes[i].row()) taken.append(t_item) else: t_item = parent.parent().takeChild(indexes[i].row()) taken.append(t_item) # end for # insert them back in at their new positions for i in range(len(indexes)): # Either at a specific point or appended if row == -1: if drop_index.isValid(): parent = self.itemFromIndex(drop_index) parent.insertChild(parent.childCount(), taken.pop()) else: self.insertTopLevelItem(self.topLevelItemCount(), taken.pop()) else: r = new_drop_index.row( ) if new_drop_index.row() >= 0 else row if drop_index.isValid(): parent = self.itemFromIndex(drop_index) parent.insertChild(min(r, parent.childCount()), taken.pop()) else: self.insertTopLevelItem( min(r, self.topLevelItemCount()), taken.pop()) # end for event.accept() # Don't want QAbstractItemView to delete it because it was "moved" we already did it event.setDropAction(Qt.CopyAction) QTreeView.dropEvent(self, event)
class Viewer(QtMainWindow): jobAdded = Signal() jobFinished = Signal() def __init__(self, weboob, parent=None): super(Viewer, self).__init__(parent) self.ui = Ui_Viewer() self.ui.setupUi(self) self.ui.prevButton.clicked.connect(self.prev) self.ui.nextButton.clicked.connect(self.next) self.ui.firstButton.clicked.connect(self.first) self.ui.lastButton.clicked.connect(self.last) self.ui.actionZoomIn.triggered.connect(self.zoomIn) self.ui.actionZoomOut.triggered.connect(self.zoomOut) self.ui.actionFullSize.triggered.connect(self.zoomFullSize) self.ui.actionFitWindow.triggered.connect(self.zoomFit) self.ui.actionSaveImage.setShortcut(QKeySequence.Save) self.ui.actionSaveImage.triggered.connect(self.saveImage) self.ui.actionClose.setShortcut(QKeySequence.Close) self.ui.actionClose.triggered.connect(self.close) self.model = None self.current = None self.total = 0 self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self.weboob = weboob def setData(self, model, qidx): self.model = model self.current = QPersistentModelIndex(qidx) self.model.rowsInserted.connect(self.updatePos) self.model.rowsRemoved.connect(self.updatePos) self.model.rowsInserted.connect(self.updateNavButtons) self.model.rowsRemoved.connect(self.updateNavButtons) self.model.dataChanged.connect(self._dataChanged) self.model.modelReset.connect(self.disable) self.updateImage() @Slot() def disable(self): self.setEnabled(False) def updateNavButtons(self): prev = self.current.row() > 0 self.ui.prevButton.setEnabled(prev) self.ui.firstButton.setEnabled(prev) next = self.current.row() < self.total - 1 self.ui.nextButton.setEnabled(next) self.ui.lastButton.setEnabled(next) def updatePos(self): self.total = self.model.rowCount(self.current.parent()) self.ui.posLabel.setText('%d / %d' % (self.current.row() + 1, self.total)) def updateImage(self): self.updatePos() self.updateNavButtons() obj = self.current.data(ResultModel.RoleObject) if obj.data is NotLoaded: self.model.fillObj(obj, ['data'], QModelIndex(self.current)) self.pixmap = None elif obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot(QModelIndex) def _dataChanged(self, qidx): if qidx == self.current: obj = qidx.data(ResultModel.RoleObject) if obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot() def next(self): new = self.current.sibling(self.current.row() + 1, 0) if not new.isValid(): return self.current = QPersistentModelIndex(new) self.updateImage() @Slot() def prev(self): if self.current.row() == 0: return self.current = QPersistentModelIndex(self.current.sibling(self.current.row() - 1, 0)) self.updateImage() @Slot() def first(self): self.current = QPersistentModelIndex(self.current.sibling(0, 0)) self.updateImage() @Slot() def last(self): self.current = QPersistentModelIndex(self.current.sibling(self.total - 1, 0)) self.updateImage() @Slot() def zoomIn(self): self.zoomFactor *= 1.25 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomOut(self): self.zoomFactor *= 0.75 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFullSize(self): self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFit(self): self.zoomMode = ZOOM_FIT self._rebuildImage() def resizeEvent(self, ev): super(Viewer, self).resizeEvent(ev) if self.zoomMode == ZOOM_FIT: self._rebuildImage() def _rebuildZoom(self): if self.zoomMode == ZOOM_FACTOR: new_width = int(self.pixmap.width() * self.zoomFactor) pixmap = self.pixmap.scaledToWidth(new_width, Qt.SmoothTransformation) else: new_size = self.ui.scrollArea.viewport().size() pixmap = self.pixmap.scaled(new_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.zoomFactor = pixmap.width() / float(self.pixmap.width()) return pixmap def _rebuildImage(self): if self.pixmap is None: self.ui.view.setText('Loading...') return elif self.pixmap.isNull(): self.ui.view.setText('Image could not be loaded') return pixmap = self._rebuildZoom() self.ui.view.setPixmap(pixmap) @Slot() def saveImage(self): def ext_for_filter(s): return re.match(r'(?:[A-Z]+) \(\*\.([a-z]+)\)$', s).group(1) if not self.pixmap: return filters = ['PNG (*.png)', 'JPEG (*.jpg)', 'GIF (*.gif)'] obj = self.current.data(ResultModel.RoleObject) name = '%s.%s' % (obj.title or obj.id or u'', obj.ext or 'png') default = filters[0] for f in filters: if name.endswith(ext_for_filter(f)): default = f filters = ';;'.join(filters) target = os.path.join(self.parent().lastSaveDir, name) out, filter = QFileDialog.getSaveFileName(self, 'Save image', target, filters, default) if not out: return ext = ext_for_filter(filter) self.parent().lastSaveDir = os.path.dirname(out) if not os.path.splitext(out)[1]: out = '%s.%s' % (out, ext) if os.path.exists(out): q = self.tr('%s already exists, are you sure you want to replace it?') % out reply = QMessageBox.question(self, self.tr('Overwrite?'), q) if reply == QMessageBox.No: return self.saveImage() self.pixmap.save(out, ext.upper())
class Viewer(QtMainWindow): jobAdded = Signal() jobFinished = Signal() def __init__(self, weboob, parent=None): super(Viewer, self).__init__(parent) self.ui = Ui_Viewer() self.ui.setupUi(self) self.ui.prevButton.clicked.connect(self.prev) self.ui.nextButton.clicked.connect(self.next) self.ui.firstButton.clicked.connect(self.first) self.ui.lastButton.clicked.connect(self.last) self.ui.actionZoomIn.triggered.connect(self.zoomIn) self.ui.actionZoomOut.triggered.connect(self.zoomOut) self.ui.actionFullSize.triggered.connect(self.zoomFullSize) self.ui.actionFitWindow.triggered.connect(self.zoomFit) self.ui.actionSaveImage.setShortcut(QKeySequence.Save) self.ui.actionSaveImage.triggered.connect(self.saveImage) self.ui.actionClose.setShortcut(QKeySequence.Close) self.ui.actionClose.triggered.connect(self.close) self.model = None self.current = None self.total = 0 self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self.weboob = weboob def setData(self, model, qidx): self.model = model self.current = QPersistentModelIndex(qidx) self.model.rowsInserted.connect(self.updatePos) self.model.rowsRemoved.connect(self.updatePos) self.model.rowsInserted.connect(self.updateNavButtons) self.model.rowsRemoved.connect(self.updateNavButtons) self.model.dataChanged.connect(self._dataChanged) self.model.modelReset.connect(self.disable) self.updateImage() @Slot() def disable(self): self.setEnabled(False) def updateNavButtons(self): prev = self.current.row() > 0 self.ui.prevButton.setEnabled(prev) self.ui.firstButton.setEnabled(prev) next = self.current.row() < self.total - 1 self.ui.nextButton.setEnabled(next) self.ui.lastButton.setEnabled(next) def updatePos(self): self.total = self.model.rowCount(self.current.parent()) self.ui.posLabel.setText('%d / %d' % (self.current.row() + 1, self.total)) def updateImage(self): self.updatePos() self.updateNavButtons() obj = self.current.data(ResultModel.RoleObject) if obj.data is NotLoaded: self.model.fillObj(obj, ['data'], QModelIndex(self.current)) self.pixmap = None elif obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot(QModelIndex) def _dataChanged(self, qidx): if qidx == self.current: obj = qidx.data(ResultModel.RoleObject) if obj.data: self.pixmap = QPixmap(QImage.fromData(obj.data)) else: self.pixmap = QPixmap() self._rebuildImage() @Slot() def next(self): new = self.current.sibling(self.current.row() + 1, 0) if not new.isValid(): return self.current = QPersistentModelIndex(new) self.updateImage() @Slot() def prev(self): if self.current.row() == 0: return self.current = QPersistentModelIndex( self.current.sibling(self.current.row() - 1, 0)) self.updateImage() @Slot() def first(self): self.current = QPersistentModelIndex(self.current.sibling(0, 0)) self.updateImage() @Slot() def last(self): self.current = QPersistentModelIndex( self.current.sibling(self.total - 1, 0)) self.updateImage() @Slot() def zoomIn(self): self.zoomFactor *= 1.25 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomOut(self): self.zoomFactor *= 0.75 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFullSize(self): self.zoomFactor = 1 self.zoomMode = ZOOM_FACTOR self._rebuildImage() @Slot() def zoomFit(self): self.zoomMode = ZOOM_FIT self._rebuildImage() def resizeEvent(self, ev): super(Viewer, self).resizeEvent(ev) if self.zoomMode == ZOOM_FIT: self._rebuildImage() def _rebuildZoom(self): if self.zoomMode == ZOOM_FACTOR: new_width = int(self.pixmap.width() * self.zoomFactor) pixmap = self.pixmap.scaledToWidth(new_width, Qt.SmoothTransformation) else: new_size = self.ui.scrollArea.viewport().size() pixmap = self.pixmap.scaled(new_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.zoomFactor = pixmap.width() / float(self.pixmap.width()) return pixmap def _rebuildImage(self): if self.pixmap is None: self.ui.view.setText('Loading...') return elif self.pixmap.isNull(): self.ui.view.setText('Image could not be loaded') return pixmap = self._rebuildZoom() self.ui.view.setPixmap(pixmap) @Slot() def saveImage(self): def ext_for_filter(s): return re.match(r'(?:[A-Z]+) \(\*\.([a-z]+)\)$', s).group(1) if not self.pixmap: return filters = ['PNG (*.png)', 'JPEG (*.jpg)', 'GIF (*.gif)'] obj = self.current.data(ResultModel.RoleObject) name = '%s.%s' % (obj.title or obj.id or u'', obj.ext or 'png') default = filters[0] for f in filters: if name.endswith(ext_for_filter(f)): default = f filters = ';;'.join(filters) target = os.path.join(self.parent().lastSaveDir, name) out, filter = QFileDialog.getSaveFileName(self, 'Save image', target, filters, default) if not out: return ext = ext_for_filter(filter) self.parent().lastSaveDir = os.path.dirname(out) if not os.path.splitext(out)[1]: out = '%s.%s' % (out, ext) if os.path.exists(out): q = self.tr( '%s already exists, are you sure you want to replace it?' ) % out reply = QMessageBox.question(self, self.tr('Overwrite?'), q) if reply == QMessageBox.No: return self.saveImage() self.pixmap.save(out, ext.upper())
def cleardata(self, tableview, tablemodel, data): for r in range(len(data)): tableview.selectRow(r) for model_index in tableview.selectionModel().selectedRows(): index = QPersistentModelIndex(model_index) tablemodel.removeRow(index.row())
def fillTable(self, init=False): try: if self.crs is None or self.crsLay is None: return if self.isHidden() and not init: return if self.debug: self.info.log("fillTable", "debug", self.debug) self.blockItemChange = True self.tblCoords.clear() self.tblCoords.setColumnCount(5) self.tblCoords.setHorizontalHeaderItem(0, QTableWidgetItem("X")) self.tblCoords.setHorizontalHeaderItem(1, QTableWidgetItem("Y")) self.tblCoords.setHorizontalHeaderItem(2, QTableWidgetItem("")) self.tblCoords.setHorizontalHeaderItem(3, QTableWidgetItem("Xr")) self.tblCoords.setHorizontalHeaderItem(4, QTableWidgetItem("Yr")) self.tblCoords.horizontalHeader().setSectionHidden(3, self.debug) # self.tblCoords.setColumnHidden(3, self.debug) self.tblCoords.setColumnHidden(4, self.debug) self.tblCoords.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) self.tblCoords.horizontalHeader().setSectionResizeMode( 2, QHeaderView.ResizeToContents) # QHeaderView.Fixed destCrs = self.crs self.canvas.refresh() if self.cboFeat.currentData(): feat = self.layer.getFeature(self.cboFeat.currentData()) geometry = feat.geometry() tr = QgsCoordinateTransform(self.crsLay, destCrs, self.prj) row = 0 column = 2 # btn column for v in geometry.vertices(): self.tblCoords.setRowCount(row + 1) if self.debug: self.info.log("vertex:", v.x(), v.y()) v.transform(tr) itemX = QTableWidgetItem(str(v.x())) self.tblCoords.setItem(row, 0, itemX) itemY = QTableWidgetItem(str(v.y())) self.tblCoords.setItem(row, 1, itemY) itemXr = QTableWidgetItem(str(v.x())) self.tblCoords.setItem(row, 3, itemXr) itemYr = QTableWidgetItem(str(v.y())) self.tblCoords.setItem(row, 4, itemYr) index = QPersistentModelIndex(self.tblCoords.model().index( row, column)) btn = MyButton(self.gtomain) btn.setIcon(self.icon) btn.click.connect(lambda *args, index=index: self. cellClick(index.row(), index.column())) btn.setEnabled(False) btn.setPixmap(self.icon.pixmap(24, 24)) self.tblCoords.setCellWidget(row, 2, btn) row = row + 1 if self.debug: self.info.log("vertex transformed:", v.x(), v.y()) self.reset() if geometry.type( ) == QgsWkbTypes.GeometryType.PolygonGeometry: # remove double vertex???? self.tblCoords.removeRow(self.tblCoords.rowCount() - 1) if self.isVisible(): self.setRubber() self.markedFeature = self.helper.markFeature( self.layer, feat) self.btnZoomTo.setEnabled(True) self.blockItemChange = False self.tblCoords.setCurrentCell(0, 0) else: self.reset() self.blockItemChange = False except Exception as e: self.info.err(e)