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