2013-03-05 35 views
0

TabletEvents是鼠標事件。Qt 4.8。 Mac OS上的平板電腦事件10.6.8

MAC OS Qt 4.8.0 - 4.8.5的實際值。 在任何操作系統上的Qt 4.7.3以及Windows和Linux上的Qt 4.8.0都可以正常工作。

我有兩個QGraphcisScene實例和兩個QGraphicsView實例。 相同的類型,但一個視圖有父母,另一個 - 不(它也是透明的,用於在桌面上繪畫)。

我正在使用平板電腦(wacom鋼筆和觸摸)進行繪畫。我處理QTabletEvents,它僅適用於沒有父級(意味着父母== 0)的QGrahicsView實例。

在具有父視圖(

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 ::通知():

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噸。默認實現是event->ignore()

由於QMainWindow沒有Parent,它就是全部。 因此,平板電腦事件不涉及到QMainWindow孩子。

然後好像是QWidget *qwidget = [theView qt_qwidget];工作不對。 不幸的是,我不能對它進行調試......

請給我一些提示...我... stucked

+0

看看這個[post](http://qt-project.org/forums/viewthread/5974)它可能是相關的 – ixSci 2013-03-05 09:53:06

+0

謝謝,但它是解決方法,它不會幫助我。標準QWidget :: tabletEvent()可以爲你給我的情況重載。但這不是問題。問題出現在MAC OS上。在Windows和Linux上一切都很好。 – Inq 2013-03-06 06:47:20

+0

你的問題在很多代碼中都有擴散。什麼是你的問題?把它放在你的帖子頂部。 – UmNyobe 2013-03-07 10:13:39

回答

0

我花了更多的時間在比較的Qt 4.8.0和4.7.3和現在我看到它是內部qt事件調度程序的問題。它將事件發送到NSWindow(QMainWindow)而不是NSView(QGraphicsView)。 我沒有找到問題出在哪裏,但是我發現QMainWindow從:: event()方法返回false。 所以我重新實現該方法和解析有片劑事件:

bool UBMainWindow::event(QEvent *event) 
{ 
    bool bRes = QMainWindow::event(event); 

    if (NULL != UBApplication::boardController) 
    { 
     UBBoardView *controlV = UBApplication::boardController->controlView(); 
     if (controlV && controlV->isVisible()) 
     { 
      switch (event->type()) 
      { 
      case QEvent::TabletEnterProximity: 
      case QEvent::TabletLeaveProximity: 
      case QEvent::TabletMove: 
      case QEvent::TabletPress: 
      case QEvent::TabletRelease: 
       { 
        return controlV->directTabletEvent(event); 
       } 
      } 
     } 
    } 
    return bRes; 
} 

的問題是:我需要使用片劑用於在應用程序的任何控制,所以我需要確定何時的QGraphicsView是光標下:

bool UBBoardView::directTabletEvent(QEvent *event) 
{ 
    QTabletEvent *tEvent = static_cast<QTabletEvent *>(event); 
    tEvent = new QTabletEvent(tEvent->type() 
     , mapFromGlobal(tEvent->pos()) 
     , tEvent->globalPos() 
     , tEvent->hiResGlobalPos() 
     , tEvent->device() 
     , tEvent->pointerType() 
     , tEvent->pressure() 
     , tEvent->xTilt() 
     , tEvent->yTilt() 
     , tEvent->tangentialPressure() 
     , tEvent->rotation() 
     , tEvent->z() 
     , tEvent->modifiers() 
     , tEvent->uniqueId()); 

    if (geometry().contains(tEvent->pos())) 
    { 
     if (NULL == widgetForTabletEvent(this->parentWidget(), tEvent->pos())) 
     { 
      tabletEvent(tEvent); 
      return true; 
     } 
    } 
    return false; 
} 

另外我需要停止處理QGraphicsView孩子的平板電腦事件。或許我會有更多的時間 - 我會更深入地調查qt並解決這個問題。