示例#1
0
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 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)