get Gestures in QWindow

  • I have a program with Qmainwindow as root. In Qmainwindow I created a MainWidget inherited from Qwidget, which acts like my layout. This MainWidget contains a Qwindow, where I draw opengl directly. Now I want that my Qwindow get gestures event, if I run my program on a window tablet.
    Would I get gestures event in my MainWidget and can manually tell my Qwindow?
    If not, can I create a transparent qwidget over my Qwindow and get gestures events?
    Thanks in advance

  • Lifetime Qt Champion


    IIRC if you want to handle gesture in widgets you should take a look at this chapter of Qt's documentation.

    Hope it helps

  • @SGaist
    Thanks for your reply, but i am not sure how to get gesture events to my QWindow, since QWindow is not support QGesture.

  • Lifetime Qt Champion

    Why about using your main window as a "proxy" to your QWindow ?

  • @SGaist
    i tried but the Qmainwindow doesn't get the GestureEvents if i do it over the QWindow. I can confirm that QmainWindow does receive GestureEvent, if i perform gesture on another window like a QDockWindow, which also has Qmainwindow as parent.
    Any suggestion is appreciated. Thanks

  • Lifetime Qt Champion

    By the way, why not use QOpenGLWidget rather than QWindow since you are using widgets anyway ?

  • @SGaist
    I used all possibilities: QGLWidget, QOpenGLWidget, QOpenGLWindow and manually Qwindow+QOpenGlContext. The latter is much smoother and lightweight than others. I also have to use Qwindow.

    Another Question:
    How do I get WM_GESTURE in nativeEvent? All I get are WM_Touch events.
    There is no QNativeGestureEvent, too.

    Do you have any advices regarding following ideas:

    • use a Qwidget in a new window and make it transparent. Overlap this window with over my application to get gesture.
    • detect all needed gestures my myself from touch events
    • try to get messages in WinPrc (my app is only for Windows).

    Which way is the better one?
    Thanks in advance

  • Lifetime Qt Champion

    What's WinPrc ?

    For your ideas, what should your application do ?

  • @SGaist
    i am thinking about monitoring windows message by myself to filter wm_gesture.
    something like this:

    The development guideline for Touch Gesture on said, one can only get either WM_Touch or WM_Gesture. And it seems QT always get the WM_Touch events. I may have to unregister the app for getting touch events.

    My app is a ported programm from old win32. it contains a main are, where i draw OpenGL on a QWindow by myself. now it should get multitouch features to manipulate the content.

  • I found out the solution using native Windows Gestures WM_Gesture.
    By default QT registers QMainWindow-Window as a Touch Window, so the QMainWindow-App only get WM_Touch events.
    As said above one can only get either WM_Touch event or WM_Gesture event. So you have to unregister the window from getting Touch event. I do that in the constructor like this:

    HWND myHwnd = reinterpret_cast<HWND>(this->winId());
    PULONG flag = 0;
    bool istouch = IsTouchWindow(myHwnd,flag);

    now i get WM_Gesture events in nativeEvent:

       	bool OpenGLWindow::nativeEvent(const QByteArray & eventType, void* message, long* result)
    	MSG* msg = reinterpret_cast<MSG*>(message);
    	case WM_GESTURE:
    		emit sendNativeEvent(eventType, message, result);
    	return false;

    Thanks for your help.

Log in to reply