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

TextField and keyboard on Android

Scheduled Pinned Locked Moved Solved QML and Qt Quick
qmlandroidqt 5.6.0
16 Posts 4 Posters 10.4k Views 3 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.
  • C clochydd

    Hi, you will succeed with item.forceActiveFocus()

    SkroopaS Offline
    SkroopaS Offline
    Skroopa
    wrote on last edited by Skroopa
    #3

    @clochydd How can I use this function? It must be placed into Component.onCompleted?

    Update:

    import QtQuick 2.5
    import QtQuick.Controls 1.4
    
    Rectangle {
        color: "#00000000"
    
        TextField {
            anchors.centerIn: parent
            Component.onCompleted: {
                focus = true;
                forceActiveFocus();
            }
        }
    }
    

    Tried like this, but no effect. ):

    1 Reply Last reply
    0
    • SkroopaS Offline
      SkroopaS Offline
      Skroopa
      wrote on last edited by
      #4

      Any ideas? Why so simple and important function don't work?

      #include <QtQuick>
      
      #ifdef QT_WEBVIEW_WEBENGINE_BACKEND
      #include <QtWebEngine>
      #endif
      #include "CameraAndroid.h"
      #include "JNINative.h"
      
      int main(int argc, char *argv[]) {
      
          QGuiApplication a(argc, argv);
      
      #ifdef Q_OS_OSX
          // On OS X, correct WebView / QtQuick compositing and stacking requires running
          // Qt in layer-backed mode, which again resuires rendering on the Gui thread.
          qWarning("Setting QT_MAC_WANTS_LAYER=1 and QSG_RENDER_LOOP=basic");
          qputenv("QT_MAC_WANTS_LAYER", "1");
          qputenv("QSG_RENDER_LOOP", "basic");
      #endif
      #ifdef QT_WEBVIEW_WEBENGINE_BACKEND
          QtWebEngine::initialize();
      #endif // QT_WEBVIEW_WEBENGINE_BACKEND
      
          QQuickView view;
          view.setSource(QUrl("qrc:/main.qml"));
          view.setFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint|Qt::WindowTitleHint);
          view.setFlags(view.flags() | static_cast<Qt::WindowFlags>(Qt::WA_TranslucentBackground));
          view.setResizeMode(QQuickView::SizeRootObjectToView);
          view.setColor(QColor(Qt::transparent));
          view.showFullScreen();
          QObject::connect(view.rootContext()->engine(), SIGNAL(quit()), QGuiApplication::instance(), SLOT(quit()));
      
          return a.exec();
      }
      

      I post here code from main program. May be this can help to handle problem.

      Update
      Also tried to use TextInput, but no keyboard...

      1 Reply Last reply
      0
      • C Offline
        C Offline
        clochydd
        wrote on last edited by
        #5

        @Skroopa Initially you should put it in your Rectangle:

        Rectangle {
            color: "#00000000"
        
            TextField {
                id: myText
                anchors.centerIn: parent
                //....
            }
            Component.onCompleted: {
                myText.forceActiveFocus();
            }
        }
        
        

        And if the activefocus is changed later in your program you should restore it:

        myText.forceActiveFocus()
        

        Hope, it helps

        1 Reply Last reply
        0
        • SkroopaS Offline
          SkroopaS Offline
          Skroopa
          wrote on last edited by
          #6

          Thanks for your help, but... Keyboard isn't visible. I can't understand, where is the problem, because program absolutely simple.

          1 Reply Last reply
          0
          • ? Offline
            ? Offline
            A Former User
            wrote on last edited by A Former User
            #7

            The following works for me on Android 4.3. Does it work for you?

            main.cpp

            #include <QGuiApplication>
            #include <QQmlApplicationEngine>
            
            int main(int argc, char *argv[])
            {
                QGuiApplication app(argc, argv);
            
                QQmlApplicationEngine engine;
                engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
            
                return app.exec();
            }
            

            main.qml

            import QtQuick 2.6
            import QtQuick.Controls 1.5
            
            ApplicationWindow {
                visible: true
                width: 640
                height: 480
                title: qsTr("Hello World")
            
                Rectangle {
                    color: "#00000000"
                    anchors.fill: contentItem
            
                    TextField {
                        anchors.centerIn: parent
                    }
                }
            
                Button {
                    anchors.bottom: contentItem.bottom
                    text: "Exit"
                    onClicked: Qt.quit()
                }
            }
            
            SkroopaS 1 Reply Last reply
            0
            • ? A Former User

              The following works for me on Android 4.3. Does it work for you?

              main.cpp

              #include <QGuiApplication>
              #include <QQmlApplicationEngine>
              
              int main(int argc, char *argv[])
              {
                  QGuiApplication app(argc, argv);
              
                  QQmlApplicationEngine engine;
                  engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
              
                  return app.exec();
              }
              

              main.qml

              import QtQuick 2.6
              import QtQuick.Controls 1.5
              
              ApplicationWindow {
                  visible: true
                  width: 640
                  height: 480
                  title: qsTr("Hello World")
              
                  Rectangle {
                      color: "#00000000"
                      anchors.fill: contentItem
              
                      TextField {
                          anchors.centerIn: parent
                      }
                  }
              
                  Button {
                      anchors.bottom: contentItem.bottom
                      text: "Exit"
                      onClicked: Qt.quit()
                  }
              }
              
              SkroopaS Offline
              SkroopaS Offline
              Skroopa
              wrote on last edited by Skroopa
              #8

              @Wieland God bless you, sir! It works,
              but only if you are using ApplicationWindow... It's a bug?
              I think, we found the right path!

              Update:
              The main feature of my application, that QML GUI draws over Android's SurfaceView. Qt don't provide any tools to use Android's MediaCodec-s and I must to use Qt::WA_TranslucentBackground and Qt::WindowStaysOnTopHint flags to achive "layer-cake" like app.
              But if I use this flags, TextField / TextInput doesn't show keyboard anymore ))))):
              Is it possible to show keyboard or I must write my own keyboard widget?

              1 Reply Last reply
              0
              • SkroopaS Offline
                SkroopaS Offline
                Skroopa
                wrote on last edited by Skroopa
                #9

                Simple example:

                #include <QtQuick>
                
                int main(int argc, char *argv[]) {
                
                    QGuiApplication a(argc, argv);
                
                    QQuickView view;
                    view.setSource(QUrl("qrc:/main.qml"));
                    view.setFlags(Qt::WindowStaysOnTopHint | static_cast<Qt::WindowFlags>(Qt::WA_TranslucentBackground));
                    view.showFullScreen();
                
                    QObject::connect(view.rootContext()->engine(), SIGNAL(quit()), QGuiApplication::instance(), SLOT(quit()));
                
                    return a.exec();
                }
                

                Setting any flags to QQuickView makes TextField unfocusable and keyboard never shows on Android (not tested on iOS). Is it possible way to solve trouble with keyboard?
                I think, it is very important bug.

                UPDATE
                Also, I tried this:

                view.setFlags(view.flags());
                

                result the same - no keyboard. I'm sure - it's a bug.
                Please, someone, help. Project is stuck.

                ? 1 Reply Last reply
                0
                • SkroopaS Skroopa

                  Simple example:

                  #include <QtQuick>
                  
                  int main(int argc, char *argv[]) {
                  
                      QGuiApplication a(argc, argv);
                  
                      QQuickView view;
                      view.setSource(QUrl("qrc:/main.qml"));
                      view.setFlags(Qt::WindowStaysOnTopHint | static_cast<Qt::WindowFlags>(Qt::WA_TranslucentBackground));
                      view.showFullScreen();
                  
                      QObject::connect(view.rootContext()->engine(), SIGNAL(quit()), QGuiApplication::instance(), SLOT(quit()));
                  
                      return a.exec();
                  }
                  

                  Setting any flags to QQuickView makes TextField unfocusable and keyboard never shows on Android (not tested on iOS). Is it possible way to solve trouble with keyboard?
                  I think, it is very important bug.

                  UPDATE
                  Also, I tried this:

                  view.setFlags(view.flags());
                  

                  result the same - no keyboard. I'm sure - it's a bug.
                  Please, someone, help. Project is stuck.

                  ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by A Former User
                  #10

                  I don't think it's a bug. The Qt::WindowStaysOnTopHint flag forbids the keyboard "window" to come up. Maybe you can work around it by removing this flag everytime before the keyboard shall be shown.

                  1 Reply Last reply
                  0
                  • SkroopaS Offline
                    SkroopaS Offline
                    Skroopa
                    wrote on last edited by Skroopa
                    #11

                    Okay, after week I found the next strange things of ApplicationWindow, when I set flags: Qt.WindowStaysOnTopHint to it:

                    1. ApplicationWindow now is inactive, i.e. ApplicationWindow.active == false. requestActivate() doesn't help - active is false anyway.
                    2. ApplicationWindow's activeFocusItem == null.

                    There is two reasons, why keyboard doesn't show on Android after touching to TextField.
                    Any ideas, how to fix that? Thanks.

                    1 Reply Last reply
                    0
                    • SkroopaS Offline
                      SkroopaS Offline
                      Skroopa
                      wrote on last edited by Skroopa
                      #12

                      Tried this:

                          QGuiApplication a(argc, argv);
                          QQmlApplicationEngine engine(QUrl(QStringLiteral("qrc:/main.qml")));
                      
                          for(int i = 0; i < a.allWindows().size(); i++) {
                              if(a.allWindows()[i]->objectName() == "mainWindow") {
                                  a.allWindows()[i]->requestActivate();
                                  break;
                              }
                          }
                      

                      Without results... a.focusWindow() is NULL. Can anyone help to me?
                      ApplicationWindow is fullscreen and has width and height equal Screen size.
                      Spent for this problem more than 2 weeks - no help in any forum...

                      P.S. on Windows OS all works perfectly - window activates and focusWindow() is not NULL (gives me ApplicationWindow_QMLTYPE_73(0x6335590, name="mainWindow"))

                      1 Reply Last reply
                      0
                      • SkroopaS Offline
                        SkroopaS Offline
                        Skroopa
                        wrote on last edited by Skroopa
                        #13

                        Done!

                            for(int i = 0; i < a.allWindows().size(); i++) {
                                if(a.allWindows()[i]->objectName() == "mainWindow") {
                                    a.allWindows()[i]->close();
                                    a.allWindows()[i]->setFlags(static_cast<Qt::WindowFlags>(a.allWindows()[i]->flags()) | Qt::WindowStaysOnTopHint);
                                    a.allWindows()[i]->show();
                                    a.allWindows()[i]->showFullScreen();
                                    break;
                                }
                            }
                        

                        and keyboard is showing now! Hell, yeah!
                        Also, you must not set any flags to ApplicationWindow in QML code, otherwise keyboard will be hidden.

                        ? 1 Reply Last reply
                        3
                        • SkroopaS Skroopa

                          Done!

                              for(int i = 0; i < a.allWindows().size(); i++) {
                                  if(a.allWindows()[i]->objectName() == "mainWindow") {
                                      a.allWindows()[i]->close();
                                      a.allWindows()[i]->setFlags(static_cast<Qt::WindowFlags>(a.allWindows()[i]->flags()) | Qt::WindowStaysOnTopHint);
                                      a.allWindows()[i]->show();
                                      a.allWindows()[i]->showFullScreen();
                                      break;
                                  }
                              }
                          

                          and keyboard is showing now! Hell, yeah!
                          Also, you must not set any flags to ApplicationWindow in QML code, otherwise keyboard will be hidden.

                          ? Offline
                          ? Offline
                          A Former User
                          wrote on last edited by
                          #14

                          @Skroopa Congrats! Looks like you're the first guy on the planet who found out how this works. Hats off!

                          SkroopaS 1 Reply Last reply
                          1
                          • ? A Former User

                            @Skroopa Congrats! Looks like you're the first guy on the planet who found out how this works. Hats off!

                            SkroopaS Offline
                            SkroopaS Offline
                            Skroopa
                            wrote on last edited by Skroopa
                            #15

                            @Wieland Ha-ha! (:
                            Someone today would be drunk...

                            1 Reply Last reply
                            1
                            • R Offline
                              R Offline
                              RichardLiu
                              wrote on last edited by
                              #16

                              when the window inactive, just raise it

                              onActiveChanged:{
                              if(!rootWin.active){
                              rootWin.raise()
                              console.log("rootWin raise")
                              }
                              }

                              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