Clicking with scripts

Hackish way to generate QTableEvents.

Create new document and run script in Scripter.
Note: pan, rotate and zoom are ignored.

from random import random
from krita import Krita

from PyQt5.QtCore import (
        Qt,
        QPoint,
        QPointF,
        QEvent)

from PyQt5.QtGui import (
        QTabletEvent,)

from PyQt5.QtWidgets import (
        QWidget,
        QApplication)


def find_current_canvas():
    app = Krita.instance()
    q_window = app.activeWindow().qwindow()
    q_stacked_widget = q_window.centralWidget()
    q_mdi_area = q_stacked_widget.currentWidget()
    q_mdi_sub_window = q_mdi_area.currentSubWindow()
    view = q_mdi_sub_window.widget()
    for c in view.children():
        if c.metaObject().className() == 'KisCanvasController':
            # first QWidget child of viewport should be canvas...
            viewport = c.viewport()
            canvas = viewport.findChild(QWidget)  
            return canvas


def click_canvas(pos):
    """
    https://doc.qt.io/qt-5/qtabletevent.html
    """
    canvas = find_current_canvas()
    global_pos = QPointF(canvas.mapToGlobal(pos.toPoint()))  # precision is lost ???
    device = QTabletEvent.Stylus
    pointer_type = QTabletEvent.Pen
    pressure = random()
    x_tilt = 0
    y_tilt = 0
    tangential_pressure = 0.0
    rotation = 0.0
    z_pos = 0
    key_state = Qt.NoModifier
    unique_id = 1234  # ???
    button = Qt.LeftButton
    buttons = Qt.LeftButton

    table_press = QTabletEvent(
            QEvent.TabletPress,
            pos,
            global_pos,
            device,
            pointer_type,
            pressure,
            x_tilt,
            y_tilt,
            tangential_pressure,
            rotation,
            z_pos,
            key_state,
            unique_id,
            button,
            buttons)

    table_release = QTabletEvent(
            QEvent.TabletRelease,
            pos,
            global_pos,
            device,
            pointer_type,
            pressure,
            x_tilt,
            y_tilt,
            tangential_pressure,
            rotation,
            z_pos,
            key_state,
            unique_id,
            button,
            buttons)

    canvas.activateWindow()
    QApplication.sendEvent(canvas, table_press)
    QApplication.sendEvent(canvas, table_release)


# plot some random points...
for i in range(200):
    pos = QPointF(random() * 1000.0, random() * 1000.0)
    click_canvas(pos)

/AkiR

2 Likes