Skip to content

TextCursor

Qt Base Class: QTextCursor

Signature: QTextCursor(self) -> None QTextCursor(self, block: PySide6.QtGui.QTextBlock) -> None QTextCursor(self, cursor: PySide6.QtGui.QTextCursor) -> None QTextCursor(self, document: PySide6.QtGui.QTextDocument) -> None QTextCursor(self, frame: PySide6.QtGui.QTextFrame) -> None

Base classes

Name Children Inherits
QTextCursor
PySide6.QtGui
QTextCursor(self) -> None

⋔ Inheritance diagram

graph TD
  1473245638272["gui.TextCursor"]
  1473299704736["QtGui.QTextCursor"]
  1473291690208["Shiboken.Object"]
  140713234304496["builtins.object"]
  1473299704736 --> 1473245638272
  1473291690208 --> 1473299704736
  140713234304496 --> 1473291690208

🛈 DocStrings

Bases: QTextCursor

Source code in prettyqt\gui\textcursor.py
class TextCursor(gui.QTextCursor):
    def __str__(self):
        return self.selectedText().replace("\u2029", "\n")

    def __contains__(self, other):
        return (
            self.selectionStart() <= other.selectionStart()
            and self.selectionEnd() >= other.selectionEnd()
        )

    def move_position(
        self, operation: MoveOperationStr, mode: MoveModeStr = "move", n: int = 1
    ) -> bool:
        if n < 0:
            raise ValueError(n)
        return self.movePosition(MOVE_OPERATION[operation], MOVE_MODE[mode], n)

    def set_position(self, pos: int | tuple[int, int], mode: MoveModeStr = "move"):
        """Set cursor to given position.

        0-indexed.

        Args:
            pos: Cursor position
            mode: Move mode
        """
        match pos:
            case int():
                self.setPosition(pos, MOVE_MODE[mode])
            case (int() as row, int() as col):
                position = self.document().find_block_by_number(row).position()
                position += col
                self.set_position(position, mode=mode)
            case _:
                raise TypeError(pos)

    def select(self, selection: SelectionTypeStr | gui.QTextCursor.SelectionType):
        if isinstance(selection, gui.QTextCursor.SelectionType):
            sel = selection
        else:
            sel = SELECTION_TYPE[selection]
        super().select(sel)

    def span(self) -> tuple[int, int]:
        return (self.anchor(), self.position())

    def get_cursor_position(self) -> tuple[int, int]:
        """Return the QTextCursor position.

        The position is a tuple made up of
        the line number (0 based) and the column number (0 based).
        :return: tuple(line, column)
        """
        return (self.blockNumber(), self.positionInBlock())

    def get_selection(self) -> gui.TextDocumentFragment:
        return gui.TextDocumentFragment(self.selection())

    def select_text(
        self,
        start_pos: int | tuple[int, int] | MoveOperationStr,
        end_pos: int | tuple[int, int] | MoveOperationStr,
    ) -> str:
        """Select text from start position to end position.

        Positions can be either an integer index or a move operation

        Args:
            start_pos: Start position
            end_pos: End position
        """
        match start_pos:
            case int() | (int(), int()):
                self.set_position(start_pos)
            case str():
                self.move_position(start_pos)
            case _:
                raise TypeError(start_pos)
        match end_pos:
            case int() | (int(), int()):
                self.set_position(end_pos, mode="keep")
            case str():
                self.move_position(end_pos, mode="keep")
            case _:
                raise TypeError(end_pos)
        return self.selectedText()

    def replace_text(
        self,
        start_pos: int,
        end_pos: MoveOperationStr | int,
        to_replace: str,
    ):
        self.set_position(start_pos)
        if isinstance(end_pos, int):
            self.set_position(end_pos, mode="keep")
        else:
            self.move_position(end_pos, mode="keep")
        self.insertText(to_replace)
        self.select_text(start_pos, start_pos + len(to_replace))

    @contextlib.contextmanager
    def edit_block(self, join_previous: bool = False):
        """Context manager for edit blocks. Can be used for undo actions."""
        self.joinPreviousEditBlock() if join_previous else self.beginEditBlock()
        yield
        self.endEditBlock()

edit_block(join_previous: bool = False)

Context manager for edit blocks. Can be used for undo actions.

Source code in prettyqt\gui\textcursor.py
@contextlib.contextmanager
def edit_block(self, join_previous: bool = False):
    """Context manager for edit blocks. Can be used for undo actions."""
    self.joinPreviousEditBlock() if join_previous else self.beginEditBlock()
    yield
    self.endEditBlock()

get_cursor_position() -> tuple[int, int]

Return the QTextCursor position.

The position is a tuple made up of the line number (0 based) and the column number (0 based). :return: tuple(line, column)

Source code in prettyqt\gui\textcursor.py
def get_cursor_position(self) -> tuple[int, int]:
    """Return the QTextCursor position.

    The position is a tuple made up of
    the line number (0 based) and the column number (0 based).
    :return: tuple(line, column)
    """
    return (self.blockNumber(), self.positionInBlock())

select_text(start_pos: int | tuple[int, int] | MoveOperationStr, end_pos: int | tuple[int, int] | MoveOperationStr) -> str

Select text from start position to end position.

Positions can be either an integer index or a move operation

Parameters:

Name Type Description Default
start_pos int | tuple[int, int] | MoveOperationStr

Start position

required
end_pos int | tuple[int, int] | MoveOperationStr

End position

required
Source code in prettyqt\gui\textcursor.py
def select_text(
    self,
    start_pos: int | tuple[int, int] | MoveOperationStr,
    end_pos: int | tuple[int, int] | MoveOperationStr,
) -> str:
    """Select text from start position to end position.

    Positions can be either an integer index or a move operation

    Args:
        start_pos: Start position
        end_pos: End position
    """
    match start_pos:
        case int() | (int(), int()):
            self.set_position(start_pos)
        case str():
            self.move_position(start_pos)
        case _:
            raise TypeError(start_pos)
    match end_pos:
        case int() | (int(), int()):
            self.set_position(end_pos, mode="keep")
        case str():
            self.move_position(end_pos, mode="keep")
        case _:
            raise TypeError(end_pos)
    return self.selectedText()

set_position(pos: int | tuple[int, int], mode: MoveModeStr = 'move')

Set cursor to given position.

0-indexed.

Parameters:

Name Type Description Default
pos int | tuple[int, int]

Cursor position

required
mode MoveModeStr

Move mode

'move'
Source code in prettyqt\gui\textcursor.py
def set_position(self, pos: int | tuple[int, int], mode: MoveModeStr = "move"):
    """Set cursor to given position.

    0-indexed.

    Args:
        pos: Cursor position
        mode: Move mode
    """
    match pos:
        case int():
            self.setPosition(pos, MOVE_MODE[mode])
        case (int() as row, int() as col):
            position = self.document().find_block_by_number(row).position()
            position += col
            self.set_position(position, mode=mode)
        case _:
            raise TypeError(pos)