Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- from typing import cast
- from PySide6.QtCore import QEvent, QObject, QPointF, Qt
- from PySide6.QtGui import QMouseEvent
- from PySide6.QtWidgets import QApplication, QTableWidget, QWidget
- class ResizableTableWidget(QTableWidget):
- _grab_tol: float = 4.0
- def __init__(
- self,
- /,
- parent: QWidget | None = None,
- *,
- rowCount: int | None = None,
- columnCount: int | None = None,
- ) -> None:
- super().__init__(parent, rowCount=rowCount, columnCount=columnCount)
- self.horizontalHeader().hide()
- self.verticalHeader().hide()
- self._col_to_resize: int | None = None
- self._row_to_resize: int | None = None
- QApplication.instance().installEventFilter(self)
- def eventFilter(self, o: QObject, event: QEvent, /) -> bool:
- if o is not self.viewport():
- return False
- match event.type():
- case QEvent.Type.MouseMove:
- pos: QPointF = cast(QMouseEvent, event).position()
- x: float = pos.x()
- y: float = pos.y()
- col: bool = self.columnAt(round(x - ResizableTableWidget._grab_tol)) != self.columnAt(
- round(x + ResizableTableWidget._grab_tol)
- )
- row: bool = self.rowAt(round(y - ResizableTableWidget._grab_tol)) != self.rowAt(
- round(y + ResizableTableWidget._grab_tol)
- )
- if col and row:
- self.setCursor(Qt.CursorShape.SizeAllCursor)
- elif col:
- self.setCursor(Qt.CursorShape.SizeHorCursor)
- elif row:
- self.setCursor(Qt.CursorShape.SizeVerCursor)
- else:
- self.unsetCursor()
- if cast(QMouseEvent, event).buttons() != Qt.MouseButton.LeftButton:
- return False
- if self._col_to_resize is not None:
- if (
- abs(sum(self.columnWidth(i) for i in range(self._col_to_resize + 1)) - x)
- > ResizableTableWidget._grab_tol / 4
- ):
- self.setColumnWidth(
- self._col_to_resize,
- round(x - sum(self.columnWidth(i) for i in range(self._col_to_resize))),
- )
- self.updateGeometries()
- if self._row_to_resize is not None:
- if (
- abs(sum(self.rowHeight(i) for i in range(self._row_to_resize + 1)) - y)
- > ResizableTableWidget._grab_tol / 4
- ):
- self.setRowHeight(
- self._row_to_resize,
- round(y - sum(self.rowHeight(i) for i in range(self._row_to_resize))),
- )
- self.updateGeometries()
- case QEvent.Type.MouseButtonPress:
- if cast(QMouseEvent, event).buttons() != Qt.MouseButton.LeftButton:
- return False
- pos: QPointF = cast(QMouseEvent, event).position()
- x: float = pos.x()
- y: float = pos.y()
- if self.columnAt(round(x - ResizableTableWidget._grab_tol)) != self.columnAt(
- round(x + ResizableTableWidget._grab_tol)
- ):
- self._col_to_resize = self.columnAt(round(x - ResizableTableWidget._grab_tol))
- if self.rowAt(round(y - ResizableTableWidget._grab_tol)) != self.rowAt(
- round(y + ResizableTableWidget._grab_tol)
- ):
- self._row_to_resize = self.rowAt(round(y - ResizableTableWidget._grab_tol))
- case QEvent.Type.MouseButtonRelease:
- self._col_to_resize = None
- self._row_to_resize = None
- return False
- if __name__ == "__main__":
- QApplication(sys.argv)
- t: ResizableTableWidget = ResizableTableWidget(rowCount=4, columnCount=3)
- t.show()
- QApplication.exec()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement