Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-61652

Android's virtual keyboard "OK" button must not accept the QDialog

XMLWordPrintable

    • Android
    • e5686b35f07ea54f59e81d04a054bd832bee69b9 (qt/qtbase/dev) 05408a4e5fd1c411371983d75e361f23597cf4c7 (qt/tqtc-qtbase/5.15), 02f1e72d5 (dev)
    • 2022wk36FOQtforAndroid, 2022wk38FOQtforAndroid, 2022wk40FOQtforAndroid, 2022wk42FOQtforAndroid, 2022wk44FOQtforAndroid, 2022wk46FOQtforAndroid, 2022wk48FOQtforAndroid, 2022wk50FOQtforAndroid

      Running an app on Android, I have a QDialog with a few edit fields (`QLineEdit`) and a `QDialogButtonBox`. When user enters text in one of my `QLineEdit`, then press "OK" button from Android virtual keyboard, it accepts the dialog (as if I clicked "OK" on the `QDialogButtonBox`), while user expects to commit the text to the currently selected edit field so that he can move to the next one...

      This is really annoying and makes it almost impossible to deploy apps with dialog requesting many user inputs. A workaround would really be appreciated.

      Sample program:

      #include <QApplication>
      #include <QDialog>
      #include <QDialogButtonBox>
      #include <QPushButton>
      #include <QVBoxLayout>
      #include <QLineEdit>
      
      class MyDialog : public QDialog
      {
      public:
          MyDialog()
          {
              QVBoxLayout* layout = new QVBoxLayout(this);
              layout->addWidget( new QLineEdit( this ) );
              layout->addWidget( new QLineEdit( this ) );
      
              QDialogButtonBox* box = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this );
              connect( box, SIGNAL(accepted()), this, SLOT(accept()) );
              connect( box, SIGNAL(rejected()), this, SLOT(reject()) );
              layout->addWidget( box );
      
              box->button(QDialogButtonBox::Ok)->setAutoDefault( false );
              box->button(QDialogButtonBox::Ok)->setDefault( false );
              box->button(QDialogButtonBox::Cancel)->setAutoDefault( false );
              box->button(QDialogButtonBox::Cancel)->setDefault( false );
          }
      };
      
      int main( int argc, char* argv[] )
      {
          QApplication app(argc, argv);
          
          MyDialog dlg;
          dlg.show();
      
          return app.exec();
      }
      

        1. main.cpp
          1 kB
        2. OK_does_not_work.mp4
          735 kB
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

            bartlomiejmoskal Bartlomiej Moskal
            jpo38 Jean Porcherot
            Votes:
            1 Vote for this issue
            Watchers:
            9 Start watching this issue

              Created:
              Updated:
              Resolved:

                There are no open Gerrit changes