2013-07-03 2 views
0

QGraphicsView에 추가 한 몇 가지 QWidget에서 멀티 터치를 사용하는 데 어려움을 겪고 있습니다. QGraphicsScene과 QGraphicsView를 설정하는 QWidget의 하위 클래스를 만들었습니다. 이는 QWidget의 내 (테스트) 서브 클래스 : 이것은QGraphicsView, Windows 8의 Qt 5.0.2에서 멀티 터치를 사용하는 방법

#include "qttest1.h" 

#include <QtWidgets> 
#include <QTouchEvent> 

qttest1::qttest1(QWidget *parent) 
    : QWidget(parent) 
{ 
    setEnabled(true); 

    if(!QCoreApplication::testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)) 
     setAttribute(Qt::WA_NativeWindow); 

    setAttribute(Qt::WA_AcceptTouchEvents); 

    scene = new QGraphicsScene(this); 
    scene->setSceneRect(0, 0, 1920, 1080); 
    graphicsView = new QGraphicsView(scene, this); 
    graphicsView->setRenderHints(QPainter::Antialiasing); 
    graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    graphicsView->setAttribute(Qt::WA_AcceptTouchEvents); 
    graphicsView->viewport()->setAttribute(Qt::WA_AcceptTouchEvents); 

    QBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(graphicsView); 

    setLayout(layout); 
} 

qttest1::~qttest1() {} 

void qttest1::showGraphics() 
{ 
    for(int i = 0; i < 10; i++) 
    { 
     Dial *dial = new QDial(); 

     dial->move(i * 120 + 50, 200); 
     dial->resize(120, 120); 
     dial->setAttribute(Qt::WA_AcceptTouchEvents); 

     QGraphicsProxyWidget *proxy = scene->addWidget(dial); 
     proxy->setAcceptTouchEvents(true); 
    } 
} 

내 주요 :

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 

    app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); 

    QRect rect = app.desktop()->screenGeometry(); 

    qttest1 test; 
    test.resize(rect.width(), rect.height()); 
    test.showFullScreen(); 
    test.showGraphics(); 

    return app.exec(); 
} 

나는 코드가 꽤되지 아마 조금 누출 알고 있지만, 요점은하려고하는 것입니다 멀티 터치로 작업하십시오.

나는 장면에 추가하는 모든 종류의 위젯을보고 사용할 수 있지만 다이얼을 만지 자마자 첫 번째 이후에 오는 모든 접촉을 삼킨다. 그러면 여러 위치 사이에서 다이얼이 점프됩니다. 내가 원한 것은 모든 다이얼 (또는 어떤 유형의 위젯)도 개별적으로 동시에 사용할 수 있다는 것입니다. QT 5.0.2, Windows 8을 최대 10 개의 터치를 지원하는 모니터와 함께 사용하고 있습니다.

답변

0

Qt는 워드 프로세서 상태 : - 그래픽 보기에 항목에 대한

구현할는 QWidget :: 이벤트() 또는 위젯의 QAbstractScrollArea :: viewportEvent() 및 QGraphicsItem :: sceneEvent() 터치 이벤트를 수신합니다. 그와

, 나는 당신이 당신이 게시 한 코드에서 볼 수 없어 QEvent :: TouchBegin, QEvent :: TouchUpdate 및 QEvent :: TouchEnd 이벤트를 처리 할 필요가 있다고 생각합니다.

Qt가 첫 번째 터치를 처리 할 수 ​​있지만 두 번째, 세 번째, 네 번째 등의 동시 터치로 무엇을하고 싶은지 알 수 없습니다. 예를 들어, 당신은 당신의 앱이 두 번째 터치의 이동으로 다음 중 하나를 수행 할 수 있습니다 : -

1) 첫 번째 항목이있는 개체를 회전을 첫 번째 항목이라고 객체의 크기를 조절)

2

이상

3)에 걸쳐 그래서

등보기

5) 번역 두 번째 항목

4)를 선택, 당신은 HANDL 필요 당신이 원하는 것을하기 위해 연속적인 접촉. Qt에서 제스처를보고 싶을 수도 있습니다.

+0

필자가 작성한 작은 예제에서 QGraphicsView 내에서 멀티 터치 작업을 보았습니다. 그러나 문제는 아니지만 문제는 위젯이 동시에 작동하지 않는다는 것입니다. 예 : 두 개의 QSlide를 QGraphicsScene에 추가하고 동시에 (터치를 사용하여) 사용하려고하면 처음 만진 것만이 작동합니다. QGraphicsScene (및 QGraphicsView)을 사용하지 않고 테스트 할 때도 문제가있는 것 같지만 실제 결론을 이끌어 낼만큼 충분히 테스트하지는 않았습니다. 내가 원하는대로 내 자신의 위젯/graphisitems 그것을 구현해야 구현 말하고 있습니까? –

+0

QSlide가 QGraphicsItem 또는 Object가 아니므로 QGraphicsProxyWidget을 통해 사용하고 있습니까? 그렇다면 실제 위젯으로 전달되지 않는 다양한 것들이 있으며이 중 하나 일 수 있습니다. 귀하의 질문에 관해서는 네, 멀티 터치에 대한 응답으로 특정 동작을 정의하려면 GraphicsItem에서 상속해야합니다. 적어도 Qt 4.8에서 사용했을 때했던 것입니다. – TheDarkKnight

+0

예, QGraphicsProxyWidget을 통해 사용합니다.QGraphicsScene 내부의 위젯에 건드리지 않을 것 같은 것을 받아 들일 수 있지만 이상한 점은 예를 들어 QSearch를 QGraphicsScene에 추가하면 예상대로 작동하지만 동시에 두 개의 QSlides를 사용하면 작동하지 않습니다. –