Python 处理QTabletEvent时,如何将平板电脑的整个表面映射到Widget客户端区域?

Python 处理QTabletEvent时,如何将平板电脑的整个表面映射到Widget客户端区域?,python,events,pyqt,tablet,wacom,Python,Events,Pyqt,Tablet,Wacom,我试图处理WACOM Intoos艺术平板电脑生成的QTabletEvent事件 我成功地使用了以下代码,但不得不将处理平板电脑事件的QWidget调整为完整的Windows桌面大小,以便从其所有表面(笔所在的位置)接收平板电脑事件。默认情况下,平板电脑表面似乎映射到整个桌面。我想把它映射到我自己的widget客户端区域 如何做到这一点 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWid

我试图处理WACOM Intoos艺术平板电脑生成的QTabletEvent事件

我成功地使用了以下代码,但不得不将处理平板电脑事件的QWidget调整为完整的Windows桌面大小,以便从其所有表面(笔所在的位置)接收平板电脑事件。默认情况下,平板电脑表面似乎映射到整个桌面。我想把它映射到我自己的widget客户端区域

如何做到这一点

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class TabletSampleWindow(QWidget):
    def __init__(self, parent=None):
        super(TabletSampleWindow, self).__init__(parent)
        self.pen_is_down = False
        self.pen_x = 0
        self.pen_y = 0
        self.pen_pressure = 0
        self.text = ""
        # Resizing the sample window to full desktop size:
        frame_rect = app.desktop().frameGeometry()
        width, height = frame_rect.width(), frame_rect.height()
        self.resize(width, height)
        self.move(-9, 0)
        self.setWindowTitle("Sample Tablet Event Handling")

    def tabletEvent(self, tabletEvent):
        self.pen_x = tabletEvent.globalX()
        self.pen_y = tabletEvent.globalY()
        self.pen_pressure = int(tabletEvent.pressure() * 100)
        if tabletEvent.type() == QTabletEvent.TabletPress:
            self.pen_is_down = True
            self.text = "TabletPress event"
        elif tabletEvent.type() == QTabletEvent.TabletMove:
            self.pen_is_down = True
            self.text = "TabletMove event"
        elif tabletEvent.type() == QTabletEvent.TabletRelease:
            self.pen_is_down = False
            self.text = "TabletRelease event"
        self.text += " at x={0}, y={1}, pressure={2}%,".format(self.pen_x, self.pen_y, self.pen_pressure)
        if self.pen_is_down:
            self.text += " Pen is down."
        else:
            self.text += " Pen is up."
        tabletEvent.accept()
        self.update()

    def paintEvent(self, event):
        text = self.text
        i = text.find("\n\n")
        if i >= 0:
            text = text.left(i)
        painter = QPainter(self)
        painter.setRenderHint(QPainter.TextAntialiasing)
        painter.drawText(self.rect(), Qt.AlignTop | Qt.AlignLeft , text)

app = QApplication(sys.argv)
mainform = TabletSampleWindow()
mainform.show()
app.exec_()

如果它被映射到整个桌面,它是否也会像鼠标一样工作?(例如,在小Qt小部件外单击是否会改变窗口焦点?)。在QWidget外部单击(如果不是完全桌面扩展)将被解释为鼠标事件(因为没有小部件会接受QTabletEvent事件,将生成鼠标事件)。我不想要这种行为。我只想让我的小部件抓取/捕获整个平板电脑,并将平板电脑表面映射到我的小部件客户端区域。但我找不到这样做的方法。我怀疑那是做你想做的事情的唯一方法(据我所知)是A)停止操作系统以鼠标方式响应平板电脑,B)然后使用第三方库直接与平板电脑交互,并使用该库手动生成Qt事件,其坐标根据相对于桌面大小的窗口大小比例进行缩放。老实说,我不确定这个建议有多实用。我想知道我是否可以尝试创建一个整个桌面大小的不可见QWidget,处理并接受所有QTabletEvent事件,并将调整大小的QTabletEvent事件发送到其可见的子小部件,在其客户端区域显示图形。。。但这有点棘手,不是吗?显然,平板电脑的原理是在绘图小部件外部单击时,将其用作映射到整个桌面的鼠标。。。我的第一个意图似乎是出于这个“哲学”。。。