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.
  • 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