class BaseTableWidget(QTableWidget): def __init__(self, RowCount, HorizontalHeaderItems, parent=None): super(BaseTableWidget, self).__init__(parent) self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.setEditTriggers(QAbstractItemView.NoEditTriggers) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) self.setRowCount(RowCount) self.setColumnCount(len(HorizontalHeaderItems)+1) for i, e in enumerate(['Name']+HorizontalHeaderItems): self.setHorizontalHeaderItem(i, QTableWidgetItem(e)) class PointTableWidget(BaseTableWidget): def __init__(self, parent=None): super(PointTableWidget, self).__init__(1, ['X', 'Y', 'Fixed', 'Color', 'Current'], parent) self.setVerticalHeaderItem(0, QTableWidgetItem('Origin')) for i, e in enumerate(['Point0', '0.0', '0.0', '', 'Red', "(0.0, 0.0)"]): item = QTableWidgetItem(e) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) if i==3: item.setCheckState(Qt.Checked) if i==4: item.setIcon(colorIcons()['Red']) self.setItem(0, i, item) self.setColumnWidth(0, 60) self.setColumnWidth(1, 70) self.setColumnWidth(2, 70) self.setColumnWidth(3, 45) self.setColumnWidth(4, 90) self.setColumnWidth(5, 60) self.draged = False @pyqtSlot(list) def setSelections(self, selections): for selection in selections: self.setRangeSelected(selection, True) def selectedRows(self): a = list() for r in self.selectedRanges(): a += [i for i in range(r.topRow(), r.bottomRow()+1)] return sorted(set(a)) def mousePressEvent(self, event): super(PointTableWidget, self).mousePressEvent(event) if event.button()==Qt.LeftButton: self.draged = True def mouseReleaseEvent(self, event): super(PointTableWidget, self).mouseReleaseEvent(event) self.draged = False def mouseMoveEvent(self, event): if self.draged: selectedRows = self.selectedRows() selectedRowCount = len(selectedRows) if selectedRowCount==2 or selectedRowCount==3: drag = QDrag(self) mimeData = QMimeData() mimeData.setText(';'.join([str(e) for e in selectedRows])) drag.setMimeData(mimeData) drag.setPixmap(QPixmap(":/icons/tooltips/need{}bearings.png".format(selectedRowCount)).scaledToWidth(50)) drag.exec_() class DropTableWidget(BaseTableWidget): dragIn = None def __init__(self, RowCount, HorizontalHeaderItems, bearings, parent=None): super(DropTableWidget, self).__init__(RowCount, HorizontalHeaderItems, parent) self.setAcceptDrops(True) self.bearings = bearings def dragEnterEvent(self, event): mimeData = event.mimeData() if mimeData.hasText(): if len(mimeData.text().split(';'))==self.bearings: event.acceptProposedAction() def dragMoveEvent(self, event): event.setDropAction(Qt.MoveAction) event.accept() def dropEvent(self, event): self.dragIn.emit(*[int(e) for e in event.mimeData().text().split(';')]) event.acceptProposedAction() class LinkTableWidget(DropTableWidget): dragIn = pyqtSignal(int, int) def __init__(self, parent=None): super(LinkTableWidget, self).__init__(0, ["Start Side", "End Side", "Length"], 2, parent) self.setDragDropMode(QAbstractItemView.DropOnly) self.setColumnWidth(0, 60) self.setColumnWidth(1, 70) self.setColumnWidth(2, 70) self.setColumnWidth(3, 60) class ChainTableWidget(DropTableWidget): dragIn = pyqtSignal(int, int, int) def __init__(self, parent=None): super(ChainTableWidget, self).__init__(0, ['Point[1]', 'Point[2]', 'Point[3]', '[1]-[2]', '[2]-[3]', '[1]-[3]'], 3, parent) self.setColumnWidth(0, 60) self.setColumnWidth(1, 60) self.setColumnWidth(2, 60) self.setColumnWidth(3, 60) self.setColumnWidth(4, 60) self.setColumnWidth(5, 60) self.setColumnWidth(6, 60)