2015-09-15 36 views
0

我正在嘗試手勢......並失敗。下面
我的代碼試圖讓捏—變焦,但沒有改變無法讓Qt手勢(QPinchGesture)正常工作

#include <QApplication> 
#include <QtWidgets> 
#include <QGraphicsView> 
#include <QPinchGesture> 
#include <QGestureEvent> 
#include <QGraphicsRectItem> 
#include <QMessageBox> 

class MyView: public QGraphicsView 
{ 
public: 
    MyView(QWidget *parent = 0) 
    { 
     Q_UNUSED(parent); 
     setTransformationAnchor(AnchorUnderMouse); 
     resetTransform(); 
     setDragMode(ScrollHandDrag); 
     grabGesture(Qt::PinchGesture); 
    } 
protected: 
    virtual bool event(QEvent *event) 
    { 
     if (event->type() == QEvent::Gesture) 
      return gestureEvent(static_cast<QGestureEvent*>(event)); 
     return QGraphicsView::event(event); 
    } 
private: 
    bool gestureEvent(QGestureEvent *event) 
    { 
     if (QGesture *pinch = event->gesture(Qt::PinchGesture)) 
      pinchTriggered(static_cast<QPinchGesture *>(pinch)); 
     return true; 
    } 
    void pinchTriggered(QPinchGesture* event) 
    { 
     QMessageBox::information(0, tr("pinch"), tr("triggered.")); 
     // ... rest of the code may or may not work but I can't seem to get here 
     // so I removed it for now 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QGraphicsScene scene(-20, -20, 150, 150); 
    MyView view; 
    view.setScene(&scene); 
    QGraphicsRectItem* item = new QGraphicsRectItem(QRectF(0,0,100,100)); 
    scene.addItem(item); 
    view.ensureVisible(scene.sceneRect()); 
    view.show(); 
    return a.exec(); 
} 

我跟着Qt的例子 - 對掐:Image Gestures Example。我看不到我缺少的重要部分 - 但我看不到任何結果。
這是很難排除故障 - 沒有斷點或qDebug - 所以我用了QMessageBox,一個簡單的文本放在pinchTriggered()的開頭 - 它從未顯示。

我嘗試了2種不同的設備 - Surface Pro 3和自定義Android設備。

對於兩者,我都能夠成功實現手勢QTapAndHoldGesture(使用相同的邏輯)。

所以...看來,

QGesture *pinch = event->gesture(Qt::PinchGesture) 

總是NULL ...

我希望有人能找到我的小樣本中的錯誤。我忽略了什麼?或者是否需要在設備中進行一些設置?

回答

1

您可能會在構造函數中錯過以下內容。

setAttribute(Qt::WA_AcceptTouchEvents); 
+0

謝謝,我會嘗試下一次我可以在觸摸屏設備上獲得這個,如果它做出改變,我會接受。 – Thalia

+0

這個'setAttribute'調用不起作用。 'grabGesture()'已經爲你做了。 – RyanCu

0

這些變化爲我工作(Windows 7中的Qt 4.7.1):

  • 在你的構造,與上viewport()一個類似的呼籲,而不是取代grabGesture(Qt::PinchGesture)

    viewport()->grabGesture(Qt::PinchGesture); 
    
  • 替換您的MyView::event()覆蓋與viewportEvent()覆蓋是這樣的:

    virtual bool viewportEvent(QEvent *event) 
    { 
        if (event->type() == QEvent::Gesture) 
        { 
         return gestureEvent(static_cast<QGestureEvent*>(event)); 
        } 
        else if (event->type() == QEvent::TouchBegin) 
        { 
         return false; 
        } 
        else return QGraphicsView::viewportEvent(event); 
    }