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. Zoom in and out of a QTextEdit with touch pad gestures?
QtWS25 Last Chance

Zoom in and out of a QTextEdit with touch pad gestures?

Scheduled Pinned Locked Moved Unsolved General and Desktop
zoomqtexteditgesturegestures
13 Posts 2 Posters 2.9k 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.
  • L Offline
    L Offline
    legitnameyo
    wrote on last edited by legitnameyo
    #1

    I need an OS agnostic way (it works on Linux, Windows and macOS) to, for example, pinch with two fingers on the computer touch pad and then zoom the text in a QTextEdit. I am unable to get the gesture to register. This is what I've got so far in my .cpp

    bool ZoomCode::gestureEvent(QGestureEvent *event) {
        qDebug() << "Gesture";
    }
    void ZoomCode::panTriggered(QPanGesture *e) {
        qDebug() << "Gesture pan";
    }
    void ZoomCode::pinchTriggered(QPinchGesture *e) {
        qDebug() << "Gesture pinch";
    }
    

    it doesn't register any gestures. I've also tried with QNativeGestureEvent and that doesn't work either. I'm running macOS Mojave 10.14 with Qt 5.12.1

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi
      I would try the Image Gestures Example
      alt text

      and see if Qt does register your touch in first place.

      1 Reply Last reply
      0
      • L Offline
        L Offline
        legitnameyo
        wrote on last edited by
        #3

        Gestures works perfectly in Image Gestures Example! I tried this as well but it doesn't work either

        bool ZoomCode::gestureEvent(QGestureEvent *event)
        {
            if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {qDebug() << "swipe";}
            else if (QGesture *pan = event->gesture(Qt::PanGesture)){qDebug() << "pan";}
            if (QGesture *pinch = event->gesture(Qt::PinchGesture)){qDebug() << "pinch";}
            return true;
        }
        
        1 Reply Last reply
        1
        • L Offline
          L Offline
          legitnameyo
          wrote on last edited by
          #4

          After trying

          bool ZoomCode::event(QEvent *event)
          {
              qDebug() << event->type();
              if (event->type() == QEvent::Gesture) {
                  qDebug() << "gesture";
                  gestureEvent(static_cast<QGestureEvent*>(event));
              }
          }
          
          bool ZoomCode::gestureEvent(QGestureEvent *event)
          {
              qDebug() << "ENTERED!";
              if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {qDebug() << "swipe"; /*exit(-1);*/}
              else if (QGesture *pan = event->gesture(Qt::PanGesture)){qDebug() << "pan"; /*exit(-1);*/}
              if (QGesture *pinch = event->gesture(Qt::PinchGesture)){qDebug() << "pinch"; /*exit(-1);*/}
              return true;
          }
          

          I see that the event is QEvent::NativeGesture, I'll try to follow that lead and I'll post my result soon.

          1 Reply Last reply
          1
          • L Offline
            L Offline
            legitnameyo
            wrote on last edited by
            #5

            when I do

            bool ZoomCode::event(QEvent *event)
            {
                if (event->type() == QEvent::NativeGesture) {
                 qDebug() << event;
                }
            }
            

            I get

            QNativeGestureEvent(ZoomNativeGesture, localPos=714.98,31.1211, value=0.0039978)
            QNativeGestureEvent(ZoomNativeGesture, localPos=714.98,31.1211, value=0.0139923)
            QNativeGestureEvent(RotateNativeGesture, localPos=714.98,31.1211, value=-0.619853)
            QNativeGestureEvent(EndNativeGesture, localPos=714.98,31.1211, value=0)
            

            how do I get the value?

            1 Reply Last reply
            0
            • L Offline
              L Offline
              legitnameyo
              wrote on last edited by
              #6

              Solved it by doing this

                      qDebug() << static_cast<QNativeGestureEvent*>(event)->value();
              

              So now I can get value, position, gesture and so on.

              1 Reply Last reply
              1
              • L Offline
                L Offline
                legitnameyo
                wrote on last edited by
                #7

                Not solved, nothing in the program works when I do

                bool ZoomCode::event(QEvent *event)
                {
                    if (event->type() == QEvent::NativeGesture) {
                        qreal value = static_cast<QNativeGestureEvent*>(event)->value();
                
                        if(value > 0) {
                            textEdit->zoomIn(value);
                        } else if(value < 0) {
                            textEdit->zoomOut(value);
                        }
                    }
                
                }
                

                Even when I only have the event(...) function and nothing inside it the program doesn't work. With doesn't work I mean I am not able to press buttons or scroll / edit the QTextEdit...

                mrjjM 1 Reply Last reply
                0
                • L legitnameyo

                  Not solved, nothing in the program works when I do

                  bool ZoomCode::event(QEvent *event)
                  {
                      if (event->type() == QEvent::NativeGesture) {
                          qreal value = static_cast<QNativeGestureEvent*>(event)->value();
                  
                          if(value > 0) {
                              textEdit->zoomIn(value);
                          } else if(value < 0) {
                              textEdit->zoomOut(value);
                          }
                      }
                  
                  }
                  

                  Even when I only have the event(...) function and nothing inside it the program doesn't work. With doesn't work I mean I am not able to press buttons or scroll / edit the QTextEdit...

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @legitnameyo
                  Hi when you do not use the event, you should forward it to base so other features can still work

                  bool ZoomCode::event(QEvent *event)
                  {
                      if (event->type() == QEvent::NativeGesture) {
                          qreal value = static_cast<QNativeGestureEvent*>(event)->value();
                  
                          if(value > 0) {
                              textEdit->zoomIn(value);
                          } else if(value < 0) {
                              textEdit->zoomOut(value);
                          }
                      } else
                    QWidget::event(event); // forward 
                  
                  }
                  
                  1 Reply Last reply
                  2
                  • L Offline
                    L Offline
                    legitnameyo
                    wrote on last edited by legitnameyo
                    #9

                    Fixed it by doing as @mrjj said and also adding "return true" inside the if statement (at the end)

                    Edit: the text does NOT zoom in our out. The zoomIn and zoomOut is called but does not do anything. I read on the docs that "Note: Zooming into HTML documents only works if the font-size is not set to a fixed size." Might that be the reason it won't zoom?

                    1 Reply Last reply
                    1
                    • L Offline
                      L Offline
                      legitnameyo
                      wrote on last edited by
                      #10

                      I had to utilize another method to zoom the text in my QTextEdit since zoomIn and zoomOut does not work for me. I did the following

                      if(value > 0) {
                                  QTextCursor cursor = textEdit->textCursor();
                                  textEdit->selectAll();
                                  textEdit->setFontPointSize(textEdit->fontPointSize()*(1 + value));
                                  textEdit->setTextCursor( cursor );
                                  textEdit->zoomIn(5);
                              } else if(value < 0) {
                                  QTextCursor cursor = textEdit->textCursor();
                                  textEdit->selectAll();
                                  textEdit->setFontPointSize(textEdit->fontPointSize()*(1 + value));
                                  textEdit->setTextCursor( cursor );
                                  textEdit->zoomOut(-5);
                              }
                      

                      to scale the text.

                      1 Reply Last reply
                      1
                      • L Offline
                        L Offline
                        legitnameyo
                        wrote on last edited by legitnameyo
                        #11

                        Still not solved... Realized now that if I style certain parts of the text with a font size, that font size will get undone and set to the font size of every other character when I do this. The zoom destroys my formatting... I still can't get zoomIn and zoomOut to work no matter what I try and there is very little documentation on it as well.

                        the Image Gesture Example uses another function to actually scale and not zoom, so looking at that example won't work now either...

                        Edit: I know the zoomIn and zoomOut functions work because I created a new project, added a QTextEdit and zoomed in by 50x and it worked. I don't set the font of the QTextEdit to anything specific anywhere in my original project code...

                        1 Reply Last reply
                        0
                        • L Offline
                          L Offline
                          legitnameyo
                          wrote on last edited by legitnameyo
                          #12

                          The zoom works when I create new blank QTextEdit's but when I do the following

                          QFile file("/Users/user/documents/saved_qtextedit_text.txt");
                          
                                  if (file.open(QFile::ReadOnly | QFile::Text)) {
                                     textEdit->setHtml(file.readAll());
                                  }
                          

                          the zoom stops working

                          Edit: Even adding the source code of zoom does not work (https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtextedit.cpp.html#_ZN9QTextEdit7zoomInFEf):

                          bool ZoomCode::gestureEvent(QNativeGestureEvent *e) {
                              float value = static_cast<float>(e->value());
                          
                              if(1) { // redundant
                                  qDebug() << "ZOOMING!"; // gets called so the program gets here
                                  QFont f = font();
                                  const float newSize = f.pointSizeF() + value;
                                  f.setPointSizeF(newSize);
                                  setFont(f);
                          
                                 // does not work with textEdit->setFont(f); either
                          
                                  //textEdit->zoomIn(20);
                              }
                          
                          1 Reply Last reply
                          0
                          • L Offline
                            L Offline
                            legitnameyo
                            wrote on last edited by
                            #13

                            The following partially works and I post in the hopes that someone might get an idea that will fix my issue :)

                            bool ZoomCode::event(QEvent *event)
                            {
                                if (event->type() == QEvent::NativeGesture) {
                                    return gestureEvent(static_cast<QNativeGestureEvent*>(event));
                                }
                                return QWidget::event(event);
                            }
                            
                            bool ZoomCode::gestureEvent(QNativeGestureEvent *e) {
                                float value = e->value();
                            
                                textEdit->setFontPointSize(NULL); // zoom does not work without this
                                textEdit->selectAll(); // some part of the text has to be selected before the zoom in the text starts to work. It does NOT matter if it is the WHOLE text or just a character in the text, just as long as something gets highlighted. Afterwards, nothing has to be highlighted again for the zoom to work. The zoom works on the whole text, no matter what part has been highlighted.
                            
                                if(value >0) {
                                      zoomIn(value + 5); // + 5 to add some zoom strength
                                } else if(value < 0)
                                    zoomOut(value - 5); // -5 to add some zoom strength
                                }
                            }
                            
                            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