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