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 Update on Monday, May 27th 2025

Android backbutton

Scheduled Pinned Locked Moved Mobile and Embedded
15 Posts 13 Posters 32.5k 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.
  • niqtN Offline
    niqtN Offline
    niqt
    wrote on last edited by
    #1

    I'm making simple examples with Qt 5.1 for android, but i have noted that with the backbutton the app exit instead of come back at previous stack page. Will be it also in future version? I think that is very important to have native behaviour (without trick).

    1 Reply Last reply
    2
    • M Offline
      M Offline
      Moster
      wrote on last edited by
      #2

      I think 5.1 is more like a beta suport for android. Some essential stuff like camera and full sensor support is missing (some are working though).
      I guess Qt5.2 will be awesome

      1 Reply Last reply
      0
      • F Offline
        F Offline
        flaviomarcio
        wrote on last edited by
        #3

        This is true, but I'll tell you alpha version 4.1 was better than qt5.1 for android, was more stable

        Flavio Portela

        1 Reply Last reply
        0
        • martin_kyM Offline
          martin_kyM Offline
          martin_ky
          wrote on last edited by
          #4

          Hi there. The back button functionality works nicely in the Qt 5.1 developer preview without need for any tricks and behaves "according to specification":http://developer.android.com/reference/android/app/Activity.html (scroll to onKeyDown method).

          According to Android documentation, the back button event is delivered via Activity.onKeyUp() which is translated as QEvent::KeyRelease with key code Qt::Key_Back.

          To prevent your app from quitting, you have to handle (accept) this event. For example, in QML you would do something like this:

          @
          Rectangle {
          focus: true // important - otherwise we'll get no key events

          Keys.onReleased: {
              if (event.key == Qt.Key_Back) {
                  console.log("Back button captured - wunderbar !")
                  event.accepted = true
              }
          }
          

          }
          @

          If you want to handle it on C++ level, override keyReleaseEvent() of your main Window and do the same in there.

          That being said, how you implement the "come back at previous stack page" is entirely up to you.

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

            Thanks for explaining :) It is a bit odd that it somehow works its way to quit.

            1 Reply Last reply
            0
            • 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