Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Touchscreen QPushButton does not emit released()
QtWS25 Last Chance

Touchscreen QPushButton does not emit released()

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 3 Posters 705 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • bigguinessB Offline
    bigguinessB Offline
    bigguiness
    wrote on last edited by
    #1

    I have a dialog running on a touchscreen that has a number of "jog" buttons on it. Each button has it's pressed and released signal connected to start and stop jogging in the specified direction. Only one button at a time is expected to get pressed.

    connect(ui->buttonXp, &QPushButton::pressed,
        this, [this](){
            //start X+ jogging
        });
    connect(ui->buttonXp, &QPushButton::released,
        this, [this](){
            //stop X+ jogging
        });
    
    // same for X-, Y+, and Y- jogging
    
    1. If I press a button and release it everything works fine.

    2. But if I press a button and another button gets pressed before the first button is released, I don't get the release for the first button. I also don't get a press or release for the second button.

    3. If I press a button then press and release a second button I do get the release for the first button. But again, no press or release for the second button.

    1 is the intended operation so that's good. 3 isn't great, since i miss the second button, but it's fine since it's not the intended operation.

    2 is a problem. It appears my touchscreen is a multi-touch, I'm not sure if that is part of the problem.

    Any ideas how I can fix this?

    Thanks

    JoeCFDJ johngodJ 2 Replies Last reply
    0
    • bigguinessB bigguiness

      I have a dialog running on a touchscreen that has a number of "jog" buttons on it. Each button has it's pressed and released signal connected to start and stop jogging in the specified direction. Only one button at a time is expected to get pressed.

      connect(ui->buttonXp, &QPushButton::pressed,
          this, [this](){
              //start X+ jogging
          });
      connect(ui->buttonXp, &QPushButton::released,
          this, [this](){
              //stop X+ jogging
          });
      
      // same for X-, Y+, and Y- jogging
      
      1. If I press a button and release it everything works fine.

      2. But if I press a button and another button gets pressed before the first button is released, I don't get the release for the first button. I also don't get a press or release for the second button.

      3. If I press a button then press and release a second button I do get the release for the first button. But again, no press or release for the second button.

      1 is the intended operation so that's good. 3 isn't great, since i miss the second button, but it's fine since it's not the intended operation.

      2 is a problem. It appears my touchscreen is a multi-touch, I'm not sure if that is part of the problem.

      Any ideas how I can fix this?

      Thanks

      JoeCFDJ Offline
      JoeCFDJ Offline
      JoeCFD
      wrote on last edited by JoeCFD
      #2

      @bigguiness I can confirm your problem with my customized buttons on a touch screen. I guess it is not encouraged to press two buttons with two fingers at the same time. Like you can not press two buttons at the same time with a mouse. Also it is better to press buttons quickly. Slow press and release are not good with Qt on touch screen.

      Use an event filter to find out which events are sent out.

      I tried to use my two fingers to type words in my cell phone(Android) and two letters are displayed. No issue. That says Qt has problems to handle this case.

      1 Reply Last reply
      0
      • bigguinessB bigguiness

        I have a dialog running on a touchscreen that has a number of "jog" buttons on it. Each button has it's pressed and released signal connected to start and stop jogging in the specified direction. Only one button at a time is expected to get pressed.

        connect(ui->buttonXp, &QPushButton::pressed,
            this, [this](){
                //start X+ jogging
            });
        connect(ui->buttonXp, &QPushButton::released,
            this, [this](){
                //stop X+ jogging
            });
        
        // same for X-, Y+, and Y- jogging
        
        1. If I press a button and release it everything works fine.

        2. But if I press a button and another button gets pressed before the first button is released, I don't get the release for the first button. I also don't get a press or release for the second button.

        3. If I press a button then press and release a second button I do get the release for the first button. But again, no press or release for the second button.

        1 is the intended operation so that's good. 3 isn't great, since i miss the second button, but it's fine since it's not the intended operation.

        2 is a problem. It appears my touchscreen is a multi-touch, I'm not sure if that is part of the problem.

        Any ideas how I can fix this?

        Thanks

        johngodJ Offline
        johngodJ Offline
        johngod
        wrote on last edited by
        #3

        @bigguiness Hi
        If you are using widgets I don't have a clue how to fix this, if using qml is a option, this can be fixed with MultiPointTouchArea and TouchPoint but with some limitations. TouchPoint does not have press and release signals, you would have to use onPressedChanged handler. Another limitation would be the number of jog buttons pressed / released at the same time would be limited to the maximum avaible touch points in the screen (usually is 10, so probably this is not a problem, I dont see anyone using more than 10 fingers at the same time). You would have to "dinamically" "assing" each TouchPoint to a jog button, based on the order of the touchs being pressed and their screen position, which is a bit of work, but doable.

        Some pseudo code:

        MultiPointTouchArea {
            touchPoints: [
                TouchPoint {
                    id: point1
                    onPressedChanged: {
                        if (pressed) { //pressed
                            
                            if ( x, y inside jog button1 screen position)
                                jogBtn1.press()
                            
                            if ( x, y inside jog button2)
                                jogBtn2.press()
                           //add more buttons
                        }
                        else { //released
                            if ( x, y inside jog button1)
                                jogBtn1.release()
                            
                            if ( x, y inside jog button2)
                                jogBtn2.release()
                           //add more buttons
                        }
                    }
                },
                TouchPoint {
                    id: point2
                    onPressedChanged: {
                        if (pressed) { //pressed
                            
                            if ( x, y inside jog button1 screen position)
                                jogBtn1.press()
                            
                            if ( x, y inside jog button2)
                                jogBtn2.press()
                           //add more buttons
                        }
                        else { //released
                            if ( x, y inside jog button1)
                                jogBtn1.release()
                            
                            if ( x, y inside jog button2)
                                jogBtn2.release()
                           //add more buttons
                        }
                    }
                },
                //repeat same stuff for TouchPoint 3}
        
        JoeCFDJ 1 Reply Last reply
        0
        • johngodJ johngod

          @bigguiness Hi
          If you are using widgets I don't have a clue how to fix this, if using qml is a option, this can be fixed with MultiPointTouchArea and TouchPoint but with some limitations. TouchPoint does not have press and release signals, you would have to use onPressedChanged handler. Another limitation would be the number of jog buttons pressed / released at the same time would be limited to the maximum avaible touch points in the screen (usually is 10, so probably this is not a problem, I dont see anyone using more than 10 fingers at the same time). You would have to "dinamically" "assing" each TouchPoint to a jog button, based on the order of the touchs being pressed and their screen position, which is a bit of work, but doable.

          Some pseudo code:

          MultiPointTouchArea {
              touchPoints: [
                  TouchPoint {
                      id: point1
                      onPressedChanged: {
                          if (pressed) { //pressed
                              
                              if ( x, y inside jog button1 screen position)
                                  jogBtn1.press()
                              
                              if ( x, y inside jog button2)
                                  jogBtn2.press()
                             //add more buttons
                          }
                          else { //released
                              if ( x, y inside jog button1)
                                  jogBtn1.release()
                              
                              if ( x, y inside jog button2)
                                  jogBtn2.release()
                             //add more buttons
                          }
                      }
                  },
                  TouchPoint {
                      id: point2
                      onPressedChanged: {
                          if (pressed) { //pressed
                              
                              if ( x, y inside jog button1 screen position)
                                  jogBtn1.press()
                              
                              if ( x, y inside jog button2)
                                  jogBtn2.press()
                             //add more buttons
                          }
                          else { //released
                              if ( x, y inside jog button1)
                                  jogBtn1.release()
                              
                              if ( x, y inside jog button2)
                                  jogBtn2.release()
                             //add more buttons
                          }
                      }
                  },
                  //repeat same stuff for TouchPoint 3}
          
          JoeCFDJ Offline
          JoeCFDJ Offline
          JoeCFD
          wrote on last edited by
          #4

          @johngod said in Touchscreen QPushButton does not emit released():

          MultiPointTouchArea

          Do the similar thing with touch events?

          protected:
              bool event(QEvent *event) override
              {
                  if (event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate || event->type() == QEvent::TouchEnd)
                  {
                      QTouchEvent* touchEvent = static_cast<QTouchEvent*>(event);
                      
                      foreach (const QTouchEvent::TouchPoint &touchPoint, touchEvent->touchPoints())
                      {
                          // Handle touch events here
                          qDebug() << "Touch event ID: " << touchPoint.id()
                                   << "Pos: " << touchPoint.pos()
                                   << "Pressure: " << touchPoint.pressure();
                      }
                      
                      return true; // Mark the event as handled
                  }
          
                  return QWidget::event(event);
              }
          
          bigguinessB 1 Reply Last reply
          0
          • JoeCFDJ JoeCFD

            @johngod said in Touchscreen QPushButton does not emit released():

            MultiPointTouchArea

            Do the similar thing with touch events?

            protected:
                bool event(QEvent *event) override
                {
                    if (event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate || event->type() == QEvent::TouchEnd)
                    {
                        QTouchEvent* touchEvent = static_cast<QTouchEvent*>(event);
                        
                        foreach (const QTouchEvent::TouchPoint &touchPoint, touchEvent->touchPoints())
                        {
                            // Handle touch events here
                            qDebug() << "Touch event ID: " << touchPoint.id()
                                     << "Pos: " << touchPoint.pos()
                                     << "Pressure: " << touchPoint.pressure();
                        }
                        
                        return true; // Mark the event as handled
                    }
            
                    return QWidget::event(event);
                }
            
            bigguinessB Offline
            bigguinessB Offline
            bigguiness
            wrote on last edited by
            #5

            @JoeCFD
            I tried adding the event() override to see if I could do something in it to handle the multi-touch event. Right now it's just a big switch() that outputs a qDebug() message for every event->type() so I can see what is happening. Once I verified it worked I started disabling the message for various events (Enter, Move, Leave, Paint, etc.) to filter out only the ones I am interested in.

            The output I am seeing now is not quite what I expected.

            My "jog" buttons are actually handled in a widget that I put on the dialog.

            namespace Ui {
            class Jogger;
            }
            
            class Jogger : public QWidget {
                Q_OBJECT
            public:
                // Constructor/Destructor
                // public methods
            protected:
                bool event(QEvent *event) override;
                ....
            };
            

            All the buttons are connected to the QPushButton::pressed() and QPushButton::released() signals using lambdas. I have added some qDebug() in each to debug the press/release.

            When I run code on a Windows machine (non-touchscreen) and use a mouse, I see debug like this when I press/release a button:

            Jogger : buttonXp pressed
            Jogger : buttonXp released
            

            I always get a press/release for a single button. If I click on a button and move the mouse off the button then back on the button then release, I see something like this:

            Jogger : buttonXp pressed
            Jogger : buttonXp released
            QEvent::MouseMove
            QEvent::MouseMove
            QEvent::MouseMove
            QEvent::MouseMove
            Jogger : buttonXp pressed
            Jogger : buttonXp released
            

            So moving off the button results in a released() and moving back on results in a pressed(). The move onto another button does not result in a pressed() for the new button.

            If I click somewhere that is not a button I see this:

            QEvent::MouseButtonPress
            QEvent::MouseButtonRelease
            

            I was surprised that I did not get the MouseButtonPress/MouseButtonRelease events for the buttons. I guess the pressed()/released() is handled first so the event() never occurs.

            I need to rebuild the code to run on my BeagleBone platform with the touchscreen. Hopefully it will output the TouchBegin/TouchUpdate/TouchEnd events. Not sure what I am going to be able to do with them but at least I have a path to look at...

            bigguinessB 1 Reply Last reply
            0
            • bigguinessB bigguiness

              @JoeCFD
              I tried adding the event() override to see if I could do something in it to handle the multi-touch event. Right now it's just a big switch() that outputs a qDebug() message for every event->type() so I can see what is happening. Once I verified it worked I started disabling the message for various events (Enter, Move, Leave, Paint, etc.) to filter out only the ones I am interested in.

              The output I am seeing now is not quite what I expected.

              My "jog" buttons are actually handled in a widget that I put on the dialog.

              namespace Ui {
              class Jogger;
              }
              
              class Jogger : public QWidget {
                  Q_OBJECT
              public:
                  // Constructor/Destructor
                  // public methods
              protected:
                  bool event(QEvent *event) override;
                  ....
              };
              

              All the buttons are connected to the QPushButton::pressed() and QPushButton::released() signals using lambdas. I have added some qDebug() in each to debug the press/release.

              When I run code on a Windows machine (non-touchscreen) and use a mouse, I see debug like this when I press/release a button:

              Jogger : buttonXp pressed
              Jogger : buttonXp released
              

              I always get a press/release for a single button. If I click on a button and move the mouse off the button then back on the button then release, I see something like this:

              Jogger : buttonXp pressed
              Jogger : buttonXp released
              QEvent::MouseMove
              QEvent::MouseMove
              QEvent::MouseMove
              QEvent::MouseMove
              Jogger : buttonXp pressed
              Jogger : buttonXp released
              

              So moving off the button results in a released() and moving back on results in a pressed(). The move onto another button does not result in a pressed() for the new button.

              If I click somewhere that is not a button I see this:

              QEvent::MouseButtonPress
              QEvent::MouseButtonRelease
              

              I was surprised that I did not get the MouseButtonPress/MouseButtonRelease events for the buttons. I guess the pressed()/released() is handled first so the event() never occurs.

              I need to rebuild the code to run on my BeagleBone platform with the touchscreen. Hopefully it will output the TouchBegin/TouchUpdate/TouchEnd events. Not sure what I am going to be able to do with them but at least I have a path to look at...

              bigguinessB Offline
              bigguinessB Offline
              bigguiness
              wrote on last edited by
              #6

              OK this is confusing.

              If I touch and release a non-button location on the touchscreen I get:

              QEvent::MouseButtonPress
              QEvent::MouseButtonRelease
              

              If I touch and release two fingers to a non-button location I get:

              QEvent::MouseButtonPress
              QEvent::TouchUpdate
              Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
              Touch ID: 1 Pos: QPointF(xxx,xxx) Pressure: 0
              QEvent::TouchUpdate
              Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
              Touch ID: 1 Pos: QPointF(xxx,xxx) Pressure: 0
              QEvent::TouchUpdate
              Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
              QEvent::TouchEnd
              Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
              

              The last TouchUpdate and Touch may be Touch ID 0 or 1 depending on which finger is lifted first.

              If I touch and release one button I get:

              Jogger : buttonXX pressed
              Jogger : buttonXX released
              

              If I touch one button then another then release the second then the first I get:

              Jogger : buttonXX pressed
              Jogger : buttonXX released
              

              And if I touch one button then another then release the first then the second I get:

              Jogger : buttonXX pressed
              

              So, I do get the multi-touch events as long as I don't touch a button. But touching a button does not give me any events. And it they are not released in the correct order, I don't get the final release.

              Any other ideas?

              JoeCFDJ 1 Reply Last reply
              0
              • bigguinessB bigguiness

                OK this is confusing.

                If I touch and release a non-button location on the touchscreen I get:

                QEvent::MouseButtonPress
                QEvent::MouseButtonRelease
                

                If I touch and release two fingers to a non-button location I get:

                QEvent::MouseButtonPress
                QEvent::TouchUpdate
                Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
                Touch ID: 1 Pos: QPointF(xxx,xxx) Pressure: 0
                QEvent::TouchUpdate
                Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
                Touch ID: 1 Pos: QPointF(xxx,xxx) Pressure: 0
                QEvent::TouchUpdate
                Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
                QEvent::TouchEnd
                Touch ID: 0 Pos: QPointF(xxx,xxx) Pressure: 0
                

                The last TouchUpdate and Touch may be Touch ID 0 or 1 depending on which finger is lifted first.

                If I touch and release one button I get:

                Jogger : buttonXX pressed
                Jogger : buttonXX released
                

                If I touch one button then another then release the second then the first I get:

                Jogger : buttonXX pressed
                Jogger : buttonXX released
                

                And if I touch one button then another then release the first then the second I get:

                Jogger : buttonXX pressed
                

                So, I do get the multi-touch events as long as I don't touch a button. But touching a button does not give me any events. And it they are not released in the correct order, I don't get the final release.

                Any other ideas?

                JoeCFDJ Offline
                JoeCFDJ Offline
                JoeCFD
                wrote on last edited by JoeCFD
                #7

                @bigguiness It could be the case that touch events are converted to pressed and released events only when a button is clicked.

                Can you try one more thing:
                To receive touch events, widgets have to have the Qt::WA_AcceptTouchEvents attribute set and graphics items need to have the acceptTouchEvents attribute set to true.
                to see if you are able to get more.

                bigguinessB 1 Reply Last reply
                0
                • JoeCFDJ JoeCFD

                  @bigguiness It could be the case that touch events are converted to pressed and released events only when a button is clicked.

                  Can you try one more thing:
                  To receive touch events, widgets have to have the Qt::WA_AcceptTouchEvents attribute set and graphics items need to have the acceptTouchEvents attribute set to true.
                  to see if you are able to get more.

                  bigguinessB Offline
                  bigguinessB Offline
                  bigguiness
                  wrote on last edited by
                  #8

                  @JoeCFD setting the Qt::WA_AcceptTouchEvents attribute on all the buttons did not change anything.

                  Do i also need to set it on the Jogger widget itself? This is my Jogger widget:
                  Jogger.png

                  Also, I just noticed that the second touch does not have to be on a button. If any location in the widget is touched while a button is touched, if the button is released before the second touch I don't get the release. But, if the second location is released first I do get the release of the button.

                  bigguinessB 1 Reply Last reply
                  0
                  • bigguinessB bigguiness

                    @JoeCFD setting the Qt::WA_AcceptTouchEvents attribute on all the buttons did not change anything.

                    Do i also need to set it on the Jogger widget itself? This is my Jogger widget:
                    Jogger.png

                    Also, I just noticed that the second touch does not have to be on a button. If any location in the widget is touched while a button is touched, if the button is released before the second touch I don't get the release. But, if the second location is released first I do get the release of the button.

                    bigguinessB Offline
                    bigguinessB Offline
                    bigguiness
                    wrote on last edited by
                    #9

                    I tried setting the Qt::WA_AcceptTouchEvents attribute on the Jogger widget itself.

                    Now ALL button touches show up as TouchBegin/TouchUpdate/TouchEnd events. I never get a pressed() or released() signal.

                    bigguinessB 1 Reply Last reply
                    0
                    • bigguinessB bigguiness

                      I tried setting the Qt::WA_AcceptTouchEvents attribute on the Jogger widget itself.

                      Now ALL button touches show up as TouchBegin/TouchUpdate/TouchEnd events. I never get a pressed() or released() signal.

                      bigguinessB Offline
                      bigguinessB Offline
                      bigguiness
                      wrote on last edited by
                      #10

                      OK. The Qt::WA_AcceptTouchEvents attribute on the Jogger widget might work. I'm just not sure how to do the following.

                      1. I'm only interested in the first touch, so ignore all touchPoint.id() != 0.
                      2. A QEvent::TouchBegin event is basically a QEvent::MouseButtonPress.
                      3. A QEvent::TouchEnd is basically a QEvent::MouseButtonRelease.

                      So:

                      protected:
                          bool event(QEvent *event) override {
                              if (event->type() == QEvent::TouchBegin) {
                                  QTouchEvent *touchEvent = static_cast<QTouchEvent*>(event);
                      
                                  foreach (const QTouchEvent::TouchPoint &touchPoint, touchEvent->touchPoints()) {
                                      if (touchPoint.id() == 0) {
                                          // figure out what button is associated with the touchPoint.pos()
                                          // emit pressed() for that button
                                      }
                                  }
                                  return true; // handled as a QEvent::MouseButtonPress
                              } else if (event->type() == QEvent::TouchUpdate) {
                                  return true; // ignore these
                              } else if (event->type() == QEvent::TouchEnd) {
                                  QTouchEvent *touchEvent = static_cast<QTouchEvent*>(event);
                      
                                  foreach (const QTouchEvent::TouchPoint &touchPoint, touchEvent->touchPoints()) {
                                      if (touchPoint.id() == 0) {
                                          // figure out what button is associated with the touchPoint.pos()
                                          // emit released() for that button
                                      }
                                  }
                                  return true; // handled as a QEvent::MouseButtonRelease
                              }
                              return QWidget::event(event);
                          }
                      

                      This may work I just don't know how to work out the button based on the touchPoint.pos(). I assume after that I can just do a "emit button->pressed()/released()".

                      What do you think?

                      JoeCFDJ 1 Reply Last reply
                      0
                      • bigguinessB bigguiness

                        OK. The Qt::WA_AcceptTouchEvents attribute on the Jogger widget might work. I'm just not sure how to do the following.

                        1. I'm only interested in the first touch, so ignore all touchPoint.id() != 0.
                        2. A QEvent::TouchBegin event is basically a QEvent::MouseButtonPress.
                        3. A QEvent::TouchEnd is basically a QEvent::MouseButtonRelease.

                        So:

                        protected:
                            bool event(QEvent *event) override {
                                if (event->type() == QEvent::TouchBegin) {
                                    QTouchEvent *touchEvent = static_cast<QTouchEvent*>(event);
                        
                                    foreach (const QTouchEvent::TouchPoint &touchPoint, touchEvent->touchPoints()) {
                                        if (touchPoint.id() == 0) {
                                            // figure out what button is associated with the touchPoint.pos()
                                            // emit pressed() for that button
                                        }
                                    }
                                    return true; // handled as a QEvent::MouseButtonPress
                                } else if (event->type() == QEvent::TouchUpdate) {
                                    return true; // ignore these
                                } else if (event->type() == QEvent::TouchEnd) {
                                    QTouchEvent *touchEvent = static_cast<QTouchEvent*>(event);
                        
                                    foreach (const QTouchEvent::TouchPoint &touchPoint, touchEvent->touchPoints()) {
                                        if (touchPoint.id() == 0) {
                                            // figure out what button is associated with the touchPoint.pos()
                                            // emit released() for that button
                                        }
                                    }
                                    return true; // handled as a QEvent::MouseButtonRelease
                                }
                                return QWidget::event(event);
                            }
                        

                        This may work I just don't know how to work out the button based on the touchPoint.pos(). I assume after that I can just do a "emit button->pressed()/released()".

                        What do you think?

                        JoeCFDJ Offline
                        JoeCFDJ Offline
                        JoeCFD
                        wrote on last edited by
                        #11

                        @bigguiness if touch events come, you can get touch points from
                        https://doc.qt.io/qt-5.15/qtouchevent.html#touchPoints
                        const QListQTouchEvent::TouchPoint &QTouchEvent::touchPoints() const
                        Then follow the code of @johngod.

                        bigguinessB 1 Reply Last reply
                        0
                        • JoeCFDJ JoeCFD

                          @bigguiness if touch events come, you can get touch points from
                          https://doc.qt.io/qt-5.15/qtouchevent.html#touchPoints
                          const QListQTouchEvent::TouchPoint &QTouchEvent::touchPoints() const
                          Then follow the code of @johngod.

                          bigguinessB Offline
                          bigguinessB Offline
                          bigguiness
                          wrote on last edited by
                          #12

                          @JoeCFD I have the touch points already.

                          How do I figure out what button is associated with the point so I can then emit the pressed() or released() signal for that button.

                          JoeCFDJ 1 Reply Last reply
                          0
                          • bigguinessB bigguiness

                            @JoeCFD I have the touch points already.

                            How do I figure out what button is associated with the point so I can then emit the pressed() or released() signal for that button.

                            JoeCFDJ Offline
                            JoeCFDJ Offline
                            JoeCFD
                            wrote on last edited by JoeCFD
                            #13

                            @bigguiness check if these points are inside rect of the buttons.
                            https://doc.qt.io/qt-5.15/qrect.html#contains

                            1 Reply Last reply
                            0
                            • bigguinessB Offline
                              bigguinessB Offline
                              bigguiness
                              wrote on last edited by
                              #14

                              @JoeCFD thanks for the leads.

                              I have it working now using event() to handle the touch events instead of using the normal mouse events.

                              A couple notes about this.

                              1. Setting the Qt::WA_AcceptTouchEvents attribute disables all the normal moue events.

                              Instead of the mousePressEvent() -> emit pressed() happening, you get an event() with either a QEvent::TouchBegin or QEvent::TouchUpdate. You then have to figure out what button the touch points are associated with. Then you need to handle the "pressed" and setDown(true) the button.

                              As long as any touch is still present you will periodically get an event() with QEvent::TouchUpdate. This also happens instead of a mouseMoveEvent(). Only the touches still active will be in the touch points. If a touch you are interested in is not in the points, that associated button will need to be "released" and setDown(false).

                              Instead of a mouseReleaseEvent() -> emit released(), when all touches are released you will get an event() with QEvent::TouchEnd with the touch points of the final released touches. Again these need to be associated to buttons that need to be "released" and setDown(false).

                              In my case I'm only interested in the first touch so I ignore all QTouchEvent::TouchPoint id() != 0.

                              This seems to be something that Qt should be able to handle internally. But.... Oh well...

                              1 Reply Last reply
                              0

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved