SlideShare une entreprise Scribd logo
1  sur  51
Télécharger pour lire hors ligne
Using Multi-Touch and
Gestures with Qt
                        10/09/09
Jens Bache-Wiig
Introduction

Jens Bache-Wiig
  •  Worked on Qt since 2005
  •  Platform Team
  •  Interim Widget Pimp




                               2
Agenda

•  Introduction
Concepts
API
Examples
Q&A




                  3
Agenda

Introduction
•  Concepts
API
Examples
Q&A




               4
Concepts

What do we mean when we say multi-touch?




                                           5
Concepts

A widget reacts to multiple touch-points

For example, to zoom/scale content...


      Lorem ipsum dolor sit       Lorem ipsum dolor 
      eamt. Dolore magna 
      aliquam erat volupat. Ut    sit eamt. Dolore 
      enim ad minimum             magna aliquam 
      veniami quis. Duis sutem 
      vel eum irure dolor in 
                                  erat volupat...cvc 
      rerit laputum 




                                                        6
Concepts

  Multiple widgets react to multiple touch-points
     For example, moving several sliders at once...




                                                      7
Concepts

Real life is multi-touch
Do you open a bottle with one finger?
Applications could do it too...



                                            1



                                        2




                                                8
Concepts

Part of our future since at least 1982... 




                                      Disney © 1982 




                                                       9
Concepts




           Sony Pictures © 2009 




                                   10
hBp://www.youtube.com 
Concepts

What do we mean when we say gestures?




                                        12
Concepts

A way to make common multi-touch use-cases
easy to use in your application

• Standard, platform-specific touch-based gestures
• Extensible API for custom gestures




                                                     13
Concepts

What are standard gestures?

•  Built-in multi-touch gestures that work in standard Qt
widgets




                                                            14
Concepts

Pan gesture

•  Scrolls content
•  Works in all scrollable Qt widgets

         Lorem ipsum dolor sit          Ut enim ad minimum 
         eamt. Dolore magna             veniami quis. Duis sutem 
         aliquam erat volupat.          vel eum irure dolor in 
         Ut enim ad minimum             rerit laputum 
         veniami quis. Duis
         sutem vel eum irure
         dolor in rerit laputum




                                                                    15
Concepts

Pinch gesture

Zoom and/or rotate content




                             16
Agenda

Introduction
Concepts
•  API
Examples
Q&A




               17
API

Multi-touch
  •  New event types
     •  TouchBegin
     •  TouchUpdate
     •  TouchEnd
  •  New QTouchEvent class
  •  QWidget and QGraphicsItem API




                                     18
API

QEvent::TouchBegin
  •  First in sequence
  •  Must be accepted to receive following events




                                                    19
API

QEvent::TouchUpdate
  •  Normal event indicating activity
  •  Expect more events to follow




                                        20
API

QEvent::TouchEnd
  •  Final event in sequence
  •  No more events without a new TouchBegin




                                               21
API

TouchBegin propagation
  •  When ignored, propagate to widget under first touch-
     point
  •  Widgets never receive multiple TouchBegin
  •  New touch-points on children are combined with first
     touch-point


                  1                                      1           2




    One event, one point, to grey widget    One event, two points, to grey widget 




                                                                                     22
API

TouchUpdate, TouchEnd do not propagate




                                         23
API

QTouchEvent
  •  Event class for QWidget and QGraphicsItem
  •  Contains list of active touch points
  •  Device type – TouchScreen or TouchPad




                                                 24
API

QTouchEvent::TouchPoint
  •    Information about one touch-point
  •    Integer identifier
  •    Primary touch-point flag
  •    State - Pressed, Moved, Stationary, or Released
  •    Current, previous, starting positions
  •    Local, scene, screen, normalized translations
  •    Area, pressure (if supported by device)




                                                         25
API

Touch events are not sent by default
  •  Must be enabled first
  •  When enabled, TouchBegin event will be accepted
     unless explicitly ignored




                                                       26
API

Qt::WA_AcceptsTouchEvents
  •  Set on QWidget to receive touch events
  •  To handle events, reimplement QWidget::event()
  •  Default implementation emulates mouse events for first
     non-primary touch-point
  •  Set on viewport() of QAbstractScrollArea based
     widgets
  •  To handle events, reimplement
     QAbstractScrollArea::viewportEvent()




                                                              27
API

QGraphicsItem::setAcceptsTouchEvents(bool)
  •  Set to true on item to receive touch events
  •  To handle, reimplement QGraphicsItem::sceneEvent()
  •  No default implementation




                                                          28
API

 Gestures

 •    QGesture and QGestureRecognizer classes
 •    Widgets subscribe to gestures
 •    Using standard gestures
 •    Implementing custom gestures




                                                29
API

QGesture
   •    Base class for more complex gestures
   •    Basic properties and convenience functions
   •    Delivered to QWidget or QGraphicsObject
   •    State (Started, Updated, Finished, Canceled)

QGestureEvent
  •  Contains a list of QGestures
  •  Normal event propagation rules apply




                                                       30
API

QGestureRecognizer
  •  “Just” an event filter + state machine
  •  Registered in QApplication
  •  Announces when a gesture is triggered




                                              31
API

 How do I use a gesture?
      •  Use grabGesture() to request it
      •  Handle the QGestureEvent and get:
          QPanGesture
             -  Offset property
          QPinchGesture
             -  Center-point, rotation, scale properties




                                                           32
API

 Implementing custom gestures
 •    Create a state machine:
      - subclass QGestureRecognizer
      - implement filterEvent(), createGesture(), reset()

 •    Create a gesture object:
      - subclass QGesture (optional)
      - fill QGesture with properties




                                                            33
API

Gestures can be simple : Four finger tap
class FourFingerTapGesture : public QGestureRecognizer
{
   virtual Result filterEvent(QGesture *, QObject *, QEvent *event)
     {
         if (event->type() == QEvent::TouchUpdate)
               if (static_cast<QTouchEvent *>(event)->touchPoints.size() == 4)
                    return GestureFinished;

         return Ignore;
     }
};




                                                                                 34
API

 Gestures can be complex
 •    Event filter could implement a state machine
 •    Continuous gesture going through Qt::GestureStated
      to Qt::GestureUpdated to Qt::GestureFinished
      states.
 •    Gesture may need to hijack events, store them, and
      replay them later




                                                           35
API

Special considerations when implementing and/
or using gestures




                                                36
API

Single gesture on parent widget with children
  •  Should the parent's gesture filter events for children?
GestureContext
  •  widget-only gesture
  •  widget-with-children gesture




                                                               37
API

 Multiple gestures on a single widget
 •    All gestures filter incoming events in undefined order
 •    Ignored gestures will be propagated
 •    You can partially ignore a gesture:

 bool gestureEvent(QGestureEvent *event) {
      event->ignore(Qt::PanGesture);
      event->accept(Qt::PinchGesture);
      return true;
 }




                                                               38
API

 Gesture has priority over normal event
    handling
 •  Gesture may need several events before
    starting
 •  Normal event handling interferes with
    gesture
 •  Events should be delayed




                                             39
Agenda

Introduction
Concepts
API
•  Examples
Q&A




               40
API

ITAI: PictureBlue
by Ariel Molina




                    h$p://vimeo.com/4990545 



                                               41
Examples

Using QTouchEvent...

MyWidget::MyWidget(QWidget *parent) {
  setAttribute(Qt::WA_AcceptsTouchEvents);
}




                                             42
Examples

Using QTouchEvent...

bool MyWidget::event(QEvent *e) {
  switch (e->type()) {
  case QEvent::TouchBegin:
  case QEvent::TouchUpdate:
  case QEvent::TouchEnd:
  {
       // creative stuff here
  }
}



                                    43
Examples

Using QTouchEvent...

QTouchEvent *te = static_cast<QTouchEvent *>(e);
QList<QTouchEvent::TouchPoint> points = te->touchPoints();

if (touchPoints.count() == 2) {
    // Do something interesting here
}




                                                             44
Examples

Using QTouchEvent...

// determine scale factor
QTouchEvent::TouchPoint p0 = touchPoints.first();
QTouchEvent::TouchPoint p1 = touchPoints.last();
QLineF line1(p0.startPos(), p1.startPos());
QLineF line2(p0.pos(), p1.pos());
qreal scaleFactor = line2.length() / line1.length();
setContentScale(scaleFactor);




                                                       45
Examples

Using QTouchEvent...

// determine angle between previous and current pos
QTouchEvent::TouchPoint p0 = touchPoints.first();
QTouchEvent::TouchPoint p1 = touchPoints.last();
QLineF line1(p0.lastPos(), p1.lastPos());
QLineF line2(p0.pos(), p1.pos());
qreal angle = line2.angleTo(line1);
rotateContentBy(angle);




                                                      46
And now some gestures... 
Examples

Custom gesture – four finger tap
class FourFingerTapGesture : public QGestureRecognizer {
   virtual QGesture createGesture(QObject *) {
         return new QGesture(“FourFingerTap”); }
     }
     virtual Result filterEvent(QGesture *state, QObject *, QEvent *event) {
         if (event->type() == QEvent::TouchUpdate)
           if (static_cast<QTouchEvent *>(event)->touchPoints.size() == 4) {

               state->setProperty(“foo”, QLatin1String(“bar”));
               return GestureFinished;

           }
         return Ignore;
     }
};
                                                                               48
Examples

Custom gesture – four finger tap
class Label : public QLabel {
   virtual void gestureEvent(QGestureEvent *event) {
      if (QGesture *g = event->gesture(“FourFingerTap”)) {
          setText(g->property(“foo”));
        event->accept(g);

     } ...

 QLabel *label = new Qlabel;

 label->setPixmap(QPixmap(“qt-logo.png”));

 label->grabGesture(“FourFingerTap”);




                                                             49
Agenda

Introduction
Concepts
API
Examples
•  Q&A




               50
Thanks!

Any Questions?




                 51

Contenu connexe

Tendances

QThreads: Are You Using Them Wrong?
QThreads: Are You Using Them Wrong? QThreads: Are You Using Them Wrong?
QThreads: Are You Using Them Wrong? ICS
 
Best Practices in Qt Quick/QML - Part 3
Best Practices in Qt Quick/QML - Part 3Best Practices in Qt Quick/QML - Part 3
Best Practices in Qt Quick/QML - Part 3ICS
 
Introduction to Qt Creator
Introduction to Qt CreatorIntroduction to Qt Creator
Introduction to Qt CreatorQt
 
Qt test framework
Qt test frameworkQt test framework
Qt test frameworkICS
 
Qt and QML performance tips & tricks for Qt 4.7
Qt and QML performance tips & tricks for Qt 4.7Qt and QML performance tips & tricks for Qt 4.7
Qt and QML performance tips & tricks for Qt 4.7Pasi Kellokoski
 
Coroutines in Kotlin
Coroutines in KotlinCoroutines in Kotlin
Coroutines in KotlinAlexey Soshin
 
Qt for beginners part 1 overview and key concepts
Qt for beginners part 1   overview and key conceptsQt for beginners part 1   overview and key concepts
Qt for beginners part 1 overview and key conceptsICS
 
Meet Qt 6.0
Meet Qt 6.0 Meet Qt 6.0
Meet Qt 6.0 Qt
 
In-Depth Model/View with QML
In-Depth Model/View with QMLIn-Depth Model/View with QML
In-Depth Model/View with QMLICS
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutinesNAVER Engineering
 
Qt for Python
Qt for PythonQt for Python
Qt for PythonICS
 
Best Practices in Qt Quick/QML - Part 1 of 4
Best Practices in Qt Quick/QML - Part 1 of 4Best Practices in Qt Quick/QML - Part 1 of 4
Best Practices in Qt Quick/QML - Part 1 of 4ICS
 
Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Yoshifumi Kawai
 
Présentation Flutter
Présentation FlutterPrésentation Flutter
Présentation FlutterAppstud
 
Qt Technical Presentation
Qt Technical PresentationQt Technical Presentation
Qt Technical PresentationDaniel Rocha
 

Tendances (20)

02 - Basics of Qt
02 - Basics of Qt02 - Basics of Qt
02 - Basics of Qt
 
Introduction to Qt
Introduction to QtIntroduction to Qt
Introduction to Qt
 
QThreads: Are You Using Them Wrong?
QThreads: Are You Using Them Wrong? QThreads: Are You Using Them Wrong?
QThreads: Are You Using Them Wrong?
 
Best Practices in Qt Quick/QML - Part 3
Best Practices in Qt Quick/QML - Part 3Best Practices in Qt Quick/QML - Part 3
Best Practices in Qt Quick/QML - Part 3
 
Qt 5 - C++ and Widgets
Qt 5 - C++ and WidgetsQt 5 - C++ and Widgets
Qt 5 - C++ and Widgets
 
Introduction to Qt Creator
Introduction to Qt CreatorIntroduction to Qt Creator
Introduction to Qt Creator
 
Qt test framework
Qt test frameworkQt test framework
Qt test framework
 
Qt and QML performance tips & tricks for Qt 4.7
Qt and QML performance tips & tricks for Qt 4.7Qt and QML performance tips & tricks for Qt 4.7
Qt and QML performance tips & tricks for Qt 4.7
 
Coroutines in Kotlin
Coroutines in KotlinCoroutines in Kotlin
Coroutines in Kotlin
 
Qt Workshop
Qt WorkshopQt Workshop
Qt Workshop
 
Qt for beginners part 1 overview and key concepts
Qt for beginners part 1   overview and key conceptsQt for beginners part 1   overview and key concepts
Qt for beginners part 1 overview and key concepts
 
Meet Qt 6.0
Meet Qt 6.0 Meet Qt 6.0
Meet Qt 6.0
 
In-Depth Model/View with QML
In-Depth Model/View with QMLIn-Depth Model/View with QML
In-Depth Model/View with QML
 
Gradle
GradleGradle
Gradle
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutines
 
Qt for Python
Qt for PythonQt for Python
Qt for Python
 
Best Practices in Qt Quick/QML - Part 1 of 4
Best Practices in Qt Quick/QML - Part 1 of 4Best Practices in Qt Quick/QML - Part 1 of 4
Best Practices in Qt Quick/QML - Part 1 of 4
 
Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)
 
Présentation Flutter
Présentation FlutterPrésentation Flutter
Présentation Flutter
 
Qt Technical Presentation
Qt Technical PresentationQt Technical Presentation
Qt Technical Presentation
 

En vedette

Petri Niemi Qt Advanced Part 2
Petri Niemi Qt Advanced Part 2Petri Niemi Qt Advanced Part 2
Petri Niemi Qt Advanced Part 2NokiaAppForum
 
Multi Touch And Gesture Event Interface And Types
Multi Touch And Gesture Event Interface And TypesMulti Touch And Gesture Event Interface And Types
Multi Touch And Gesture Event Interface And TypesEthan Cha
 
Conseil ue 31 03 full text
Conseil ue 31 03 full textConseil ue 31 03 full text
Conseil ue 31 03 full textDaniel BASTIEN
 
MECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITES
MECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITESMECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITES
MECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITESArjun K Gopi
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 

En vedette (6)

Petri Niemi Qt Advanced Part 2
Petri Niemi Qt Advanced Part 2Petri Niemi Qt Advanced Part 2
Petri Niemi Qt Advanced Part 2
 
Multi Touch And Gesture Event Interface And Types
Multi Touch And Gesture Event Interface And TypesMulti Touch And Gesture Event Interface And Types
Multi Touch And Gesture Event Interface And Types
 
Qt Licensing Explained
Qt Licensing ExplainedQt Licensing Explained
Qt Licensing Explained
 
Conseil ue 31 03 full text
Conseil ue 31 03 full textConseil ue 31 03 full text
Conseil ue 31 03 full text
 
MECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITES
MECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITESMECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITES
MECHANICAL & THERMAL PROPERTIES OF NANO COMPOSITES
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 

Similaire à Using Multi-Touch and Gestures with Qt

Petri Niemi Qt Advanced Part 1
Petri Niemi Qt Advanced Part 1Petri Niemi Qt Advanced Part 1
Petri Niemi Qt Advanced Part 1NokiaAppForum
 
Using multitouch and sensors in Java
Using multitouch and sensors in JavaUsing multitouch and sensors in Java
Using multitouch and sensors in JavaIntel Software Brasil
 
Qt State Machine Framework
Qt State Machine FrameworkQt State Machine Framework
Qt State Machine Frameworkaccount inactive
 
Delegateless Coordinator
Delegateless CoordinatorDelegateless Coordinator
Delegateless CoordinatorTales Andrade
 
Meet the Widgets: Another Way to Implement UI
Meet the Widgets: Another Way to Implement UIMeet the Widgets: Another Way to Implement UI
Meet the Widgets: Another Way to Implement UIICS
 
Android Develpment vol. 2, MFF UK, 2015
Android Develpment vol. 2, MFF UK, 2015Android Develpment vol. 2, MFF UK, 2015
Android Develpment vol. 2, MFF UK, 2015Tomáš Kypta
 
PROGRAMMING IN JAVA- unit 4-part II
PROGRAMMING IN JAVA- unit 4-part IIPROGRAMMING IN JAVA- unit 4-part II
PROGRAMMING IN JAVA- unit 4-part IISivaSankari36
 
Advance ui development and design
Advance ui  development and design Advance ui  development and design
Advance ui development and design Rakesh Jha
 
Porting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - WebinarPorting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - WebinarICS
 
Porting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - WebinarPorting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - WebinarJanel Heilbrunn
 
Multi Touch presentation
Multi Touch presentationMulti Touch presentation
Multi Touch presentationsenthil0809
 

Similaire à Using Multi-Touch and Gestures with Qt (20)

Petri Niemi Qt Advanced Part 1
Petri Niemi Qt Advanced Part 1Petri Niemi Qt Advanced Part 1
Petri Niemi Qt Advanced Part 1
 
Java-Events
Java-EventsJava-Events
Java-Events
 
Using multitouch and sensors in Java
Using multitouch and sensors in JavaUsing multitouch and sensors in Java
Using multitouch and sensors in Java
 
Qt State Machine Framework
Qt State Machine FrameworkQt State Machine Framework
Qt State Machine Framework
 
Awt event
Awt eventAwt event
Awt event
 
Input and Interaction
Input and InteractionInput and Interaction
Input and Interaction
 
Delegateless Coordinator
Delegateless CoordinatorDelegateless Coordinator
Delegateless Coordinator
 
The Future of Qt Widgets
The Future of Qt WidgetsThe Future of Qt Widgets
The Future of Qt Widgets
 
The Future of Qt Widgets
The Future of Qt WidgetsThe Future of Qt Widgets
The Future of Qt Widgets
 
Qt Widget In-Depth
Qt Widget In-DepthQt Widget In-Depth
Qt Widget In-Depth
 
Qt Widgets In Depth
Qt Widgets In DepthQt Widgets In Depth
Qt Widgets In Depth
 
Meet the Widgets: Another Way to Implement UI
Meet the Widgets: Another Way to Implement UIMeet the Widgets: Another Way to Implement UI
Meet the Widgets: Another Way to Implement UI
 
Android Develpment vol. 2, MFF UK, 2015
Android Develpment vol. 2, MFF UK, 2015Android Develpment vol. 2, MFF UK, 2015
Android Develpment vol. 2, MFF UK, 2015
 
PROGRAMMING IN JAVA- unit 4-part II
PROGRAMMING IN JAVA- unit 4-part IIPROGRAMMING IN JAVA- unit 4-part II
PROGRAMMING IN JAVA- unit 4-part II
 
Dacj 2-2 b
Dacj 2-2 bDacj 2-2 b
Dacj 2-2 b
 
Advance ui development and design
Advance ui  development and design Advance ui  development and design
Advance ui development and design
 
Porting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - WebinarPorting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - Webinar
 
Porting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - WebinarPorting Motif Applications to Qt - Webinar
Porting Motif Applications to Qt - Webinar
 
Multi Touch presentation
Multi Touch presentationMulti Touch presentation
Multi Touch presentation
 
09events
09events09events
09events
 

Plus de account inactive

KDE Plasma for Mobile Phones
KDE Plasma for Mobile PhonesKDE Plasma for Mobile Phones
KDE Plasma for Mobile Phonesaccount inactive
 
Shipping Mobile Applications Using Qt for Symbian
Shipping Mobile Applications Using Qt for SymbianShipping Mobile Applications Using Qt for Symbian
Shipping Mobile Applications Using Qt for Symbianaccount inactive
 
Scripting Your Qt Application
Scripting Your Qt ApplicationScripting Your Qt Application
Scripting Your Qt Applicationaccount inactive
 
Special Effects with Qt Graphics View
Special Effects with Qt Graphics ViewSpecial Effects with Qt Graphics View
Special Effects with Qt Graphics Viewaccount inactive
 
Developments in The Qt WebKit Integration
Developments in The Qt WebKit IntegrationDevelopments in The Qt WebKit Integration
Developments in The Qt WebKit Integrationaccount inactive
 
Qt on Real Time Operating Systems
Qt on Real Time Operating SystemsQt on Real Time Operating Systems
Qt on Real Time Operating Systemsaccount inactive
 
Development with Qt for Windows CE
Development with Qt for Windows CEDevelopment with Qt for Windows CE
Development with Qt for Windows CEaccount inactive
 
Translating Qt Applications
Translating Qt ApplicationsTranslating Qt Applications
Translating Qt Applicationsaccount inactive
 
Mobile Development with Qt for Symbian
Mobile Development with Qt for SymbianMobile Development with Qt for Symbian
Mobile Development with Qt for Symbianaccount inactive
 
How to Make Your Qt App Look Native
How to Make Your Qt App Look NativeHow to Make Your Qt App Look Native
How to Make Your Qt App Look Nativeaccount inactive
 
Animation Framework: A Step Towards Modern UIs
Animation Framework: A Step Towards Modern UIsAnimation Framework: A Step Towards Modern UIs
Animation Framework: A Step Towards Modern UIsaccount inactive
 
Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)
Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)
Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)account inactive
 
Copy Your Favourite Nokia App with Qt
Copy Your Favourite Nokia App with QtCopy Your Favourite Nokia App with Qt
Copy Your Favourite Nokia App with Qtaccount inactive
 
The Next Generation Qt Item Views
The Next Generation Qt Item ViewsThe Next Generation Qt Item Views
The Next Generation Qt Item Viewsaccount inactive
 
Optimizing Performance in Qt-Based Applications
Optimizing Performance in Qt-Based ApplicationsOptimizing Performance in Qt-Based Applications
Optimizing Performance in Qt-Based Applicationsaccount inactive
 
Case Study: Using Qt to Develop Advanced GUIs & Advanced Visualization Software
Case Study: Using Qt to Develop Advanced GUIs & Advanced Visualization SoftwareCase Study: Using Qt to Develop Advanced GUIs & Advanced Visualization Software
Case Study: Using Qt to Develop Advanced GUIs & Advanced Visualization Softwareaccount inactive
 

Plus de account inactive (20)

Meet Qt
Meet QtMeet Qt
Meet Qt
 
KDE Plasma for Mobile Phones
KDE Plasma for Mobile PhonesKDE Plasma for Mobile Phones
KDE Plasma for Mobile Phones
 
Shipping Mobile Applications Using Qt for Symbian
Shipping Mobile Applications Using Qt for SymbianShipping Mobile Applications Using Qt for Symbian
Shipping Mobile Applications Using Qt for Symbian
 
Scripting Your Qt Application
Scripting Your Qt ApplicationScripting Your Qt Application
Scripting Your Qt Application
 
Special Effects with Qt Graphics View
Special Effects with Qt Graphics ViewSpecial Effects with Qt Graphics View
Special Effects with Qt Graphics View
 
Developments in The Qt WebKit Integration
Developments in The Qt WebKit IntegrationDevelopments in The Qt WebKit Integration
Developments in The Qt WebKit Integration
 
Qt Kwan-Do
Qt Kwan-DoQt Kwan-Do
Qt Kwan-Do
 
Qt on Real Time Operating Systems
Qt on Real Time Operating SystemsQt on Real Time Operating Systems
Qt on Real Time Operating Systems
 
Development with Qt for Windows CE
Development with Qt for Windows CEDevelopment with Qt for Windows CE
Development with Qt for Windows CE
 
Translating Qt Applications
Translating Qt ApplicationsTranslating Qt Applications
Translating Qt Applications
 
Qt Creator Bootcamp
Qt Creator BootcampQt Creator Bootcamp
Qt Creator Bootcamp
 
Mobile Development with Qt for Symbian
Mobile Development with Qt for SymbianMobile Development with Qt for Symbian
Mobile Development with Qt for Symbian
 
How to Make Your Qt App Look Native
How to Make Your Qt App Look NativeHow to Make Your Qt App Look Native
How to Make Your Qt App Look Native
 
Animation Framework: A Step Towards Modern UIs
Animation Framework: A Step Towards Modern UIsAnimation Framework: A Step Towards Modern UIs
Animation Framework: A Step Towards Modern UIs
 
Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)
Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)
Debugging Qt, Fixing and Contributing a Bug Report (Using Gitorious)
 
The Mobility Project
The Mobility ProjectThe Mobility Project
The Mobility Project
 
Copy Your Favourite Nokia App with Qt
Copy Your Favourite Nokia App with QtCopy Your Favourite Nokia App with Qt
Copy Your Favourite Nokia App with Qt
 
The Next Generation Qt Item Views
The Next Generation Qt Item ViewsThe Next Generation Qt Item Views
The Next Generation Qt Item Views
 
Optimizing Performance in Qt-Based Applications
Optimizing Performance in Qt-Based ApplicationsOptimizing Performance in Qt-Based Applications
Optimizing Performance in Qt-Based Applications
 
Case Study: Using Qt to Develop Advanced GUIs & Advanced Visualization Software
Case Study: Using Qt to Develop Advanced GUIs & Advanced Visualization SoftwareCase Study: Using Qt to Develop Advanced GUIs & Advanced Visualization Software
Case Study: Using Qt to Develop Advanced GUIs & Advanced Visualization Software
 

Dernier

WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 

Dernier (20)

DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 

Using Multi-Touch and Gestures with Qt

  • 1. Using Multi-Touch and Gestures with Qt 10/09/09 Jens Bache-Wiig
  • 2. Introduction Jens Bache-Wiig •  Worked on Qt since 2005 •  Platform Team •  Interim Widget Pimp 2
  • 5. Concepts What do we mean when we say multi-touch? 5
  • 6. Concepts A widget reacts to multiple touch-points For example, to zoom/scale content... Lorem ipsum dolor sit  Lorem ipsum dolor  eamt. Dolore magna  aliquam erat volupat. Ut  sit eamt. Dolore  enim ad minimum  magna aliquam  veniami quis. Duis sutem  vel eum irure dolor in  erat volupat...cvc  rerit laputum  6
  • 7. Concepts Multiple widgets react to multiple touch-points For example, moving several sliders at once... 7
  • 8. Concepts Real life is multi-touch Do you open a bottle with one finger? Applications could do it too... 1 2 8
  • 10. Concepts Sony Pictures © 2009  10
  • 12. Concepts What do we mean when we say gestures? 12
  • 13. Concepts A way to make common multi-touch use-cases easy to use in your application • Standard, platform-specific touch-based gestures • Extensible API for custom gestures 13
  • 14. Concepts What are standard gestures? •  Built-in multi-touch gestures that work in standard Qt widgets 14
  • 15. Concepts Pan gesture •  Scrolls content •  Works in all scrollable Qt widgets Lorem ipsum dolor sit Ut enim ad minimum  eamt. Dolore magna veniami quis. Duis sutem  aliquam erat volupat. vel eum irure dolor in  Ut enim ad minimum rerit laputum  veniami quis. Duis sutem vel eum irure dolor in rerit laputum 15
  • 18. API Multi-touch •  New event types •  TouchBegin •  TouchUpdate •  TouchEnd •  New QTouchEvent class •  QWidget and QGraphicsItem API 18
  • 19. API QEvent::TouchBegin •  First in sequence •  Must be accepted to receive following events 19
  • 20. API QEvent::TouchUpdate •  Normal event indicating activity •  Expect more events to follow 20
  • 21. API QEvent::TouchEnd •  Final event in sequence •  No more events without a new TouchBegin 21
  • 22. API TouchBegin propagation •  When ignored, propagate to widget under first touch- point •  Widgets never receive multiple TouchBegin •  New touch-points on children are combined with first touch-point 1 1 2 One event, one point, to grey widget  One event, two points, to grey widget  22
  • 23. API TouchUpdate, TouchEnd do not propagate 23
  • 24. API QTouchEvent •  Event class for QWidget and QGraphicsItem •  Contains list of active touch points •  Device type – TouchScreen or TouchPad 24
  • 25. API QTouchEvent::TouchPoint •  Information about one touch-point •  Integer identifier •  Primary touch-point flag •  State - Pressed, Moved, Stationary, or Released •  Current, previous, starting positions •  Local, scene, screen, normalized translations •  Area, pressure (if supported by device) 25
  • 26. API Touch events are not sent by default •  Must be enabled first •  When enabled, TouchBegin event will be accepted unless explicitly ignored 26
  • 27. API Qt::WA_AcceptsTouchEvents •  Set on QWidget to receive touch events •  To handle events, reimplement QWidget::event() •  Default implementation emulates mouse events for first non-primary touch-point •  Set on viewport() of QAbstractScrollArea based widgets •  To handle events, reimplement QAbstractScrollArea::viewportEvent() 27
  • 28. API QGraphicsItem::setAcceptsTouchEvents(bool) •  Set to true on item to receive touch events •  To handle, reimplement QGraphicsItem::sceneEvent() •  No default implementation 28
  • 29. API Gestures •  QGesture and QGestureRecognizer classes •  Widgets subscribe to gestures •  Using standard gestures •  Implementing custom gestures 29
  • 30. API QGesture •  Base class for more complex gestures •  Basic properties and convenience functions •  Delivered to QWidget or QGraphicsObject •  State (Started, Updated, Finished, Canceled) QGestureEvent •  Contains a list of QGestures •  Normal event propagation rules apply 30
  • 31. API QGestureRecognizer •  “Just” an event filter + state machine •  Registered in QApplication •  Announces when a gesture is triggered 31
  • 32. API How do I use a gesture? •  Use grabGesture() to request it •  Handle the QGestureEvent and get: QPanGesture -  Offset property QPinchGesture -  Center-point, rotation, scale properties 32
  • 33. API Implementing custom gestures •  Create a state machine: - subclass QGestureRecognizer - implement filterEvent(), createGesture(), reset() •  Create a gesture object: - subclass QGesture (optional) - fill QGesture with properties 33
  • 34. API Gestures can be simple : Four finger tap class FourFingerTapGesture : public QGestureRecognizer { virtual Result filterEvent(QGesture *, QObject *, QEvent *event) { if (event->type() == QEvent::TouchUpdate) if (static_cast<QTouchEvent *>(event)->touchPoints.size() == 4) return GestureFinished; return Ignore; } }; 34
  • 35. API Gestures can be complex •  Event filter could implement a state machine •  Continuous gesture going through Qt::GestureStated to Qt::GestureUpdated to Qt::GestureFinished states. •  Gesture may need to hijack events, store them, and replay them later 35
  • 36. API Special considerations when implementing and/ or using gestures 36
  • 37. API Single gesture on parent widget with children •  Should the parent's gesture filter events for children? GestureContext •  widget-only gesture •  widget-with-children gesture 37
  • 38. API Multiple gestures on a single widget •  All gestures filter incoming events in undefined order •  Ignored gestures will be propagated •  You can partially ignore a gesture: bool gestureEvent(QGestureEvent *event) { event->ignore(Qt::PanGesture); event->accept(Qt::PinchGesture); return true; } 38
  • 39. API Gesture has priority over normal event handling •  Gesture may need several events before starting •  Normal event handling interferes with gesture •  Events should be delayed 39
  • 41. API ITAI: PictureBlue by Ariel Molina h$p://vimeo.com/4990545  41
  • 42. Examples Using QTouchEvent... MyWidget::MyWidget(QWidget *parent) { setAttribute(Qt::WA_AcceptsTouchEvents); } 42
  • 43. Examples Using QTouchEvent... bool MyWidget::event(QEvent *e) { switch (e->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: { // creative stuff here } } 43
  • 44. Examples Using QTouchEvent... QTouchEvent *te = static_cast<QTouchEvent *>(e); QList<QTouchEvent::TouchPoint> points = te->touchPoints(); if (touchPoints.count() == 2) { // Do something interesting here } 44
  • 45. Examples Using QTouchEvent... // determine scale factor QTouchEvent::TouchPoint p0 = touchPoints.first(); QTouchEvent::TouchPoint p1 = touchPoints.last(); QLineF line1(p0.startPos(), p1.startPos()); QLineF line2(p0.pos(), p1.pos()); qreal scaleFactor = line2.length() / line1.length(); setContentScale(scaleFactor); 45
  • 46. Examples Using QTouchEvent... // determine angle between previous and current pos QTouchEvent::TouchPoint p0 = touchPoints.first(); QTouchEvent::TouchPoint p1 = touchPoints.last(); QLineF line1(p0.lastPos(), p1.lastPos()); QLineF line2(p0.pos(), p1.pos()); qreal angle = line2.angleTo(line1); rotateContentBy(angle); 46
  • 48. Examples Custom gesture – four finger tap class FourFingerTapGesture : public QGestureRecognizer { virtual QGesture createGesture(QObject *) { return new QGesture(“FourFingerTap”); } } virtual Result filterEvent(QGesture *state, QObject *, QEvent *event) { if (event->type() == QEvent::TouchUpdate) if (static_cast<QTouchEvent *>(event)->touchPoints.size() == 4) { state->setProperty(“foo”, QLatin1String(“bar”)); return GestureFinished; } return Ignore; } }; 48
  • 49. Examples Custom gesture – four finger tap class Label : public QLabel { virtual void gestureEvent(QGestureEvent *event) { if (QGesture *g = event->gesture(“FourFingerTap”)) { setText(g->property(“foo”)); event->accept(g); } ... QLabel *label = new Qlabel; label->setPixmap(QPixmap(“qt-logo.png”)); label->grabGesture(“FourFingerTap”); 49