TabletEvents 以鼠标事件的形式出现。
MAC OS Qt 4.8.0 - 4.8.5 的实际值。在任何操作系统上的 Qt 4.7.3 和 Windows 和 Linux 上的 Qt 4.8.0 中都能正常工作。
我有两个 QGraphcisScene 实例和两个 QGraphicsView 实例。相同的类型,但是一个视图有父视图,而另一个视图没有(它也是透明的,用于在桌面上绘制某些东西)。
我正在使用平板电脑(wacom 笔和触控)进行绘画。我处理 QTabletEvents,它仅适用于没有父级的 QGrahicsView 实例(意味着父级==0)。
在与父母的观点上(
QMainWindow->centralWidget->ControlContainerWidget->QStackedLayout->QGraphicsView
) 平板电脑事件不来。他们来得QApplication::eventFilter
很好,但不来观看。他们来到QMainWindow
了mouseEvents
。如果我将父级设置为 0,则平板电脑事件可以正常发送。
平板事件的第一个接收者是 QMainWindow。我在里面看到qt_mac_handleTabletEvent
:
QWidget *qwidget = [theView qt_qwidget];
QWidget *widgetToGetMouse = qwidget;
进而:
`qt_sendSpontaneousEvent(widgetToGetMouse, &qtabletEvent);`
qtabletEvent
- 在调用之前创建的不接受事件sendSpontaneousEvent
。
然后在 QApplication::notify() 内部:
QWidget *w = static_cast<QWidget *>(receiver);
QTabletEvent *tablet = static_cast<QTabletEvent*>(e);
QPoint relpos = tablet->pos();
bool eventAccepted = tablet->isAccepted();
while (w) {
QTabletEvent te(tablet->type(), relpos, tablet->globalPos(),
tablet->hiResGlobalPos(), tablet->device(), tablet->pointerType(),
tablet->pressure(), tablet->xTilt(), tablet->yTilt(),
tablet->tangentialPressure(), tablet->rotation(), tablet->z(),
tablet->modifiers(), tablet->uniqueId());
te.spont = e->spontaneous();
res = d->notify_helper(w, w == receiver ? tablet : &te);
eventAccepted = ((w == receiver) ? tablet : &te)->isAccepted();
e->spont = false;
if ((res && eventAccepted)
|| w->isWindow()
|| w->testAttribute(Qt::WA_NoMousePropagation))
break;
relpos += w->pos();
w = w->parentWidget();
}
tablet->setAccepted(eventAccepted);
正如我们所见:
res = d->notify_helper(w, w == receiver ? tablet : &te);
它通过过滤器、布局然后QMainWindow::tabletEven
-t调用事件处理。默认实现是event->ignore()
.
由于 QMainWindow 没有父级,这就是全部。所以平板事件不会出现在 QMainWindow 孩子身上。
然后似乎它是 QWidget *qwidget = [theView qt_qwidget];
错误的。不幸的是,我无法调试它...
请给我一些提示...我被卡住了...