Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Android backbutton
Forum Updated to NodeBB v4.3 + New Features

Android backbutton

Scheduled Pinned Locked Moved Mobile and Embedded
15 Posts 13 Posters 32.5k Views 2 Watching
  • 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.
  • E Offline
    E Offline
    erik.ridderby
    wrote on last edited by
    #6

    I managed to catch the android back button in QML:

    @ApplicationWindow {
    onClosing: {
    close.accepted = false
    if (contextMenuManager.menuVisible)
    contextMenuManager.menuVisible = false
    }
    }@

    1 Reply Last reply
    0
    • R Offline
      R Offline
      Rizzer
      wrote on last edited by
      #7

      Keys.onReleased catches the Android back button in some instances.

      It doesn't seem to work with ListView though. focus must be directed somewhere where I haven't anticipated.

      Here is a sample main.qml with a ListView, which does not catch the Android back button:
      @
      import QtQuick 2.3
      import QtQuick.Controls 1.2
      import QtQuick.Layouts 1.1

      ApplicationWindow {
      id: appWindow
      visible: true
      width: 640
      height: 480
      title: qsTr("Hello World")

      ListModel {
          id: longModel
      
          Component.onCompleted: {
              for ( var i=1; i<=100; i++ )
                  append({"testName": i})
          }
      }
      
      
      ListView {
          anchors.fill: parent
          id: listView
          model: longModel
      
          delegate:
              Rectangle {
                  height: 80
              width: parent.width
      
              Text {
                  id: textComponent
                  text: testName
              }
              Keys.onReleased: {
                  if (event.matches(StandardKey.Back)) {
                      console.log("back caught by delegate");
                      event.accepted = true;
                  }
              }
          }
      
          focus: true
          Keys.onReleased: {
              if (event.matches(StandardKey.Back)) {
                  console.log("back caught by listview");
                  event.accepted = true;
              }
          }
      
      }
      

      }
      @

      1 Reply Last reply
      0
      • R Offline
        R Offline
        Rizzer
        wrote on last edited by
        #8

        Keys.onReleased catches the Android back button in some instances.

        It doesn't seem to work with ListView though. focus must be directed somewhere where I haven't anticipated.

        Here is a sample main.qml with a ListView, which does not catch the Android back button:
        @
        import QtQuick 2.3
        import QtQuick.Controls 1.2
        import QtQuick.Layouts 1.1

        ApplicationWindow {
        id: appWindow
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")

        ListModel {
            id: longModel
        
            Component.onCompleted: {
                for ( var i=1; i<=100; i++ )
                    append({"testName": i})
            }
        }
        
        
        ListView {
            anchors.fill: parent
            id: listView
            model: longModel
        
            delegate:
                Rectangle {
                    height: 80
                width: parent.width
        
                Text {
                    id: textComponent
                    text: testName
                }
                Keys.onReleased: {
                    if (event.matches(StandardKey.Back)) {
                        console.log("back caught by delegate");
                        event.accepted = true;
                    }
                }
            }
        
            focus: true
            Keys.onReleased: {
                if (event.matches(StandardKey.Back)) {
                    console.log("back caught by listview");
                    event.accepted = true;
                }
            }
        
        }
        

        }
        @

        1 Reply Last reply
        0
        • M Offline
          M Offline
          Mr_Ada
          wrote on last edited by
          #9

          Can someone post a C++ version of this? I have tried to convert it and I am still not seeing the back key.

          Never mind.... Here is a C++ version I was able to get to work....

          @
          #include <QDebug>

          // regular MainWindow stuff...

          void MainWindow::keyPressEvent (QKeyEvent* event) {

          if (event->key () == Qt::Key_Back)
          qDebug () << "<<keyPressEvent>> " <<
          "[[Back button]]";
          else if (event->key () == Qt::Key_HomePage)
          qDebug () << "<<keyPressEvent>> " <<
          "[[Home button]]";
          else if (event->key () == Qt::Key_Menu)
          qDebug () << "<<keyPressEvent>> " <<
          "[[Menu button]]";
          else if (event->key () == Qt::Key_unknown)
          qDebug () << "<<keyPressEvent>> " <<
          "[[Unknown button]]";
          event->accept ();
          }
          @

          1 Reply Last reply
          0
          • M Offline
            M Offline
            Mr_Ada
            wrote on last edited by
            #10

            Can someone post a C++ version of this? I have tried to convert it and I am still not seeing the back key.

            Never mind.... Here is a C++ version I was able to get to work....

            @
            #include <QDebug>

            // regular MainWindow stuff...

            void MainWindow::keyPressEvent (QKeyEvent* event) {

            if (event->key () == Qt::Key_Back)
            qDebug () << "<<keyPressEvent>> " <<
            "[[Back button]]";
            else if (event->key () == Qt::Key_HomePage)
            qDebug () << "<<keyPressEvent>> " <<
            "[[Home button]]";
            else if (event->key () == Qt::Key_Menu)
            qDebug () << "<<keyPressEvent>> " <<
            "[[Menu button]]";
            else if (event->key () == Qt::Key_unknown)
            qDebug () << "<<keyPressEvent>> " <<
            "[[Unknown button]]";
            event->accept ();
            }
            @

            1 Reply Last reply
            0
            • O Offline
              O Offline
              OE0214
              wrote on last edited by
              #11

              on Android, I did this:

              void MainWindow::keyPressEvent(QKeyEvent *event)
              {
              	if (event->key() == Qt::Key_Back)
              		qDebug() << "[[Back button]]";
              	else if (event->key() == Qt::Key_Menu)
              		qDebug() << "[[Menu button]]";
              	else if (event->key() == Qt::Key_TopMenu)
              		qDebug() << "[[Top menu button]]";
              	else
              		qDebug() << "[[some other button]]";
              
              	event->accept();
              }
              

              I get a debug message for the back button, but not for the menu button...I also tried Qt::Key_TopMenu, but still nothing

              nor do I get the "some other button" debug message when the menu button is pressed, so this method is not even being called when I press the menu button

              this message must be handled somewhere else

              can anyone help?

              Thanks

              1 Reply Last reply
              0
              • uCampaignU Offline
                uCampaignU Offline
                uCampaign
                wrote on last edited by
                #12

                In Qt 5.4.2 this is what i use and it works fine:

                ApplicationWindow {
                ....
                onClosing: {
                if (Qt.platform.os == "android") {
                close.accepted = false;
                if (stack.depth > 1) stack.pop();
                }
                }
                }

                S 1 Reply Last reply
                2
                • bbakerB Offline
                  bbakerB Offline
                  bbaker
                  wrote on last edited by
                  #13

                  C++ code. Gives the desired/standard effect on Android. Use a QWidget with a QStackedLayout in the main window.

                      stackedLayout = new QStackedLayout;
                      QWidget *c = new QWidget();
                      first = new FirstForm(this );
                  
                      stackedLayout->addWidget( first );
                  
                      c->setLayout( stackedLayout );
                      setCentralWidget( c );
                  

                  Override the closeEvent in the header:

                  protected:
                      void closeEvent(QCloseEvent *event);
                  

                  Implement the code in the body:

                  void MainWindow::closeEvent(QCloseEvent *event) {

                  if( stackedLayout->currentIndex() > 0 ) {
                      QWidget *top = stackedLayout->currentWidget();
                      stackedLayout->removeWidget( top );
                  
                      event->ignore();
                  }
                  

                  }

                  // QED

                  1 Reply Last reply
                  0
                  • uCampaignU uCampaign

                    In Qt 5.4.2 this is what i use and it works fine:

                    ApplicationWindow {
                    ....
                    onClosing: {
                    if (Qt.platform.os == "android") {
                    close.accepted = false;
                    if (stack.depth > 1) stack.pop();
                    }
                    }
                    }

                    S Offline
                    S Offline
                    seyed
                    wrote on last edited by
                    #14

                    @uCampaign this is my enhanced version:

                    Window {
                        //...
                        onClosing: {
                            if (Qt.platform.os === "android" || Qt.platform.os === "ios") {
                                close.accepted = false;
                                if (menu.isShown) menu.hide();
                                else if (stackView.depth > 1) stackView.pop();
                                else Qt.quit();
                            }
                        }
                    }
                    

                    Thank you :)

                    1 Reply Last reply
                    0
                    • K Offline
                      K Offline
                      kgregory
                      wrote on last edited by
                      #15

                      Does anyone know of a full example of an app that captures the back button? Maybe a github repo? None of these code snippets are working for me and I'm not sure why.

                      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