Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Custom QWidget Keyboard first time click issue.

Custom QWidget Keyboard first time click issue.

Scheduled Pinned Locked Moved Unsolved General and Desktop
27 Posts 5 Posters 6.2k 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.
  • dheerendraD dheerendra

    Event not received indicates that event is taken some other object and processed before it reaches keyboard widget. Did try running the program with H/W keyboard ? Which platform did you try this ?

    A Offline
    A Offline
    Arvind K
    wrote on last edited by
    #3

    @dheerendra
    For our Application we don't want to use H/W keyboard.
    We are using Ubuntu 16.04 , 64bit system with Touchscreen display.

    mrjjM 1 Reply Last reply
    0
    • A Arvind K

      @dheerendra
      For our Application we don't want to use H/W keyboard.
      We are using Ubuntu 16.04 , 64bit system with Touchscreen display.

      mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #4

      @Arvind-K
      Hi
      since you are showing no code, i wont speculate on what error might be.

      Anyway, try using QGuiApplication::focusObject();
      and see what widget has the focus.

      For my widget keyboard, i have all buttons set to NoFocus for focusPolicy as else they
      steal focus on first shown, unless i control it very tight.

      1 Reply Last reply
      2
      • A Offline
        A Offline
        Arvind K
        wrote on last edited by
        #5

        ----------------- Login widget Code -------------------------------

        frmlogin.h

        #include <QWidget>
        #include "keyboard/keyboard.h"
        #include "messagebox.h"

        namespace Ui {
        class FrmLogin;
        }

        class FrmLogin : public QWidget
        {
        Q_OBJECT

        public:
        Ui::FrmLogin *ui;
        explicit FrmLogin(QWidget *parent = 0);
        ~FrmLogin();

        private slots:
        void run_keyboard_lineEdit();
        void on_BtnCancel_clicked();

        protected:
        void showEvent(QShowEvent *event);

        private:
        Keyboard *lineEditkeyboard;
        };


        frmlogin.cpp

        FrmLogin::FrmLogin(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::FrmLogin)
        {

        ui->setupUi(this);
        setGeometry(QStyle::alignedRect(Qt::LeftToRight,Qt::AlignCenter,size(),
                                        qApp->desktop()->availableGeometry()
                                        )
                    );
        setWindowFlags ( Qt::CustomizeWindowHint | Qt::WindowTitleHint);
        lineEditkeyboard = new Keyboard();
        
        connect(ui->txt_Pass ,SIGNAL(selectionChanged()),this,SLOT(run_keyboard_lineEdit()));
        connect(ui->txt_user ,SIGNAL(selectionChanged()),this,SLOT(run_keyboard_lineEdit()));
        

        }

        void FrmLogin::run_keyboard_lineEdit()
        {
        Qt::WindowFlags flags = windowFlags();

        QLineEdit *line = (QLineEdit *)sender();
        lineEditkeyboard->setLineEdit(line);
        lineEditkeyboard->ui->lineEdit->setText(line->text());
        if(line->objectName()=="txt_Pass")
        {
            lineEditkeyboard->ui->lineEdit->setEchoMode(QLineEdit::EchoMode::Password);
        }
        else
        {
            lineEditkeyboard->ui->lineEdit->setEchoMode(QLineEdit::EchoMode::Normal);
        }
        
        lineEditkeyboard->setWindowModality(Qt::ApplicationModal);
        lineEditkeyboard->setWindowState(Qt::WindowActive);
        lineEditkeyboard->raise();
        lineEditkeyboard->show();
        

        }

        -------------- Keyboard Widget Code -----------------------------------

        Keyboard.h

        #include <QWidget>
        #include <QtGui>
        #include <QLineEdit>
        #include <QPushButton>

        namespace Ui {
        class Keyboard;
        }

        class Keyboard : public QWidget
        {
        Q_OBJECT

        public:
        bool IsOnlyCharVar=false;
        explicit Keyboard(QWidget *parent = 0);
        void setLineEdit(QLineEdit * );
        ~Keyboard();
        QPushButton *enterButton;
        Ui::Keyboard *ui;

        private slots:
        void keyboardHandler();
        void on_enterButton_clicked();
        void on_lineEdit_returnPressed();

        private:

        QString outputText;
        QLineEdit *outputLineEdit;   
        

        };

        Keyboard.cpp

        #include "keyboard.h"
        #include "ui_keyboard.h"
        #include <QtGui>
        #include "QToolTip"

        Keyboard::Keyboard(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Keyboard)
        {
        ui->setupUi(this);

        this->setWindowFlags(Qt::WindowStaysOnTopHint);   
        
        connect ( ui->Buttona, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttonb, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttonc, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttond, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttone, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttonf, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttong, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttonh, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        connect ( ui->Buttoni, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );    
        
        connect ( ui->space, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
        
        outputText = "";
        ui->lineEdit->setFocus();
        

        }

        void Keyboard::keyboardHandler()
        {
        QPushButton *button = (QPushButton *)sender();
        QString inputText = button->text();

        QToolTip::showText(button->mapToGlobal(QPoint()),inputText,button,button->rect(),300);
        
        if (inputText == "Space")
        {
            outputText += " ";
        }
        else if(inputText == "&&")
        {
            outputText += "&";
        }
        else if(inputText == "\\")
        {
            outputText += ui->Buttona->text() ;
        }
        else
        {      
            {
                outputText += inputText;
            }
        }
        ui->lineEdit->setText(outputText);
        

        }

        void Keyboard::setLineEdit(QLineEdit * line)
        {
        outputLineEdit = line;
        }

        Keyboard::~Keyboard()
        {
        delete ui;
        }

        void Keyboard::on_shift_clicked()
        {
        if(shift == true)
        {
        shift = false;
        ui->shift->setStyleSheet("background-color: rgb(248, 248, 248);");

            ui->Buttona->setText("a");
            ui->Buttons->setText("b");
            ui->Buttond->setText("c");
            ui->Buttonf->setText("d");
            ui->Buttong->setText("e");
            ui->Buttonh->setText("F");
            ui->Buttonj->setText("g");
            ui->Buttonk->setText("h");
            ui->Buttonl->setText("i");
        }
        else
        {
            shift = true;
            ui->shift->setStyleSheet("background-color: rgb(121, 121, 255);");
            ui->Buttona->setText("A");
            ui->Buttons->setText("B");
            ui->Buttond->setText("C");
            ui->Buttonf->setText("D");
            ui->Buttong->setText("E");
            ui->Buttonh->setText("F");
            ui->Buttonj->setText("G");
            ui->Buttonk->setText("H");
            ui->Buttonl->setText("I");
        }
        

        }

        void Keyboard::on_clear_clicked()
        {
        outputText="";
        ui->lineEdit->setText(outputText);
        }

        void Keyboard::on_enterButton_clicked()
        {
        //qDebug() << "enter";
        outputLineEdit->setText(outputText);
        outputText="";
        ui->lineEdit->setText(outputText);
        close();
        }

        void Keyboard::on_backButton_clicked()
        {
        //outputText.remove(outputText.length()-1,outputText.length());
        outputText.remove(outputText.length()-1,1);
        ui->lineEdit->setText(outputText);
        }

        1 Reply Last reply
        0
        • A Offline
          A Offline
          Arvind K
          wrote on last edited by
          #6

          Any Updates??
          Please feel free to ask any questions on above code.

          mrjjM 1 Reply Last reply
          0
          • A Arvind K

            Any Updates??
            Please feel free to ask any questions on above code.

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #7

            @Arvind-K
            Hi
            What did
            qDebug() << "focus widget " << qApp->focusObject();
            report ?
            in the case where it dont type.

            1 Reply Last reply
            0
            • A Offline
              A Offline
              Arvind K
              wrote on last edited by
              #8

              @mrjj

              i used qDebug() << "focus widget " << qApp->focusObject(); at button click event.

              it doesn't fire at first time . but at second time click on Button "a" i get "focus widget QPushButton(0x26bbc00, name= "Buttona")" log .

              i think at first time my keyboard widget doesn't get activate. after click on widget anywhere it gets activate and after that it works proper.

              how to solve this issue.?

              1 Reply Last reply
              0
              • J.HilkJ Offline
                J.HilkJ Offline
                J.Hilk
                Moderators
                wrote on last edited by
                #9

                Hi,

                from my experience, this behaviour comes from the focus shift,

                you click a button and than it gets the focus a and only than the clicked mechanimn works.

                IIRC, you can change that a couple of different ways.

                the following comes to my mind:

                • Chaning the signal from clicked to released
                • Subclassing QPushButton and manually emitting the pressed signal during focus in event

                Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                Q: What's that?
                A: It's blue light.
                Q: What does it do?
                A: It turns blue.

                A 1 Reply Last reply
                0
                • J.HilkJ J.Hilk

                  Hi,

                  from my experience, this behaviour comes from the focus shift,

                  you click a button and than it gets the focus a and only than the clicked mechanimn works.

                  IIRC, you can change that a couple of different ways.

                  the following comes to my mind:

                  • Chaning the signal from clicked to released
                  • Subclassing QPushButton and manually emitting the pressed signal during focus in event
                  A Offline
                  A Offline
                  Arvind K
                  wrote on last edited by
                  #10

                  @J.Hilk

                  Thank you for your reply.

                  1. At the first time my Push button click event is not getting fired so released event is also not working.
                  2. I have implemented focus in event but at first time its also not getting emitting.
                  mrjjM 1 Reply Last reply
                  0
                  • A Arvind K

                    @J.Hilk

                    Thank you for your reply.

                    1. At the first time my Push button click event is not getting fired so released event is also not working.
                    2. I have implemented focus in event but at first time its also not getting emitting.
                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #11

                    @Arvind-K
                    Hi
                    for my keyboard, I find it needed to have
                    NoFocus for focusPolicy on the buttons or they steal focus from Lineedit.

                    1 Reply Last reply
                    1
                    • A Offline
                      A Offline
                      Arvind K
                      wrote on last edited by
                      #12

                      still, the issue is pending. Please provide a solution.

                      1 Reply Last reply
                      -1
                      • D Offline
                        D Offline
                        deleted372
                        wrote on last edited by
                        #13

                        It may be a silly question, does it happen with all the buttons of your keyboard?
                        Are you sure that the first time you push on a button of your keyboard the slot keyboardHandler() gets called?

                        A 1 Reply Last reply
                        0
                        • D deleted372

                          It may be a silly question, does it happen with all the buttons of your keyboard?
                          Are you sure that the first time you push on a button of your keyboard the slot keyboardHandler() gets called?

                          A Offline
                          A Offline
                          Arvind K
                          wrote on last edited by
                          #14

                          @JoZCaVaLLo

                          Yes, it happens with all the buttons of a keyboard. slot keyboardHandler() does not get called for the first time. another thing I observed that when I called a keyboard on QPushbutton clicked event then keyboard works properly. this issue happens with QlineEdit Only.

                          1 Reply Last reply
                          0
                          • D Offline
                            D Offline
                            deleted372
                            wrote on last edited by
                            #15

                            I would call lineEditkeyboard->setLineEdit(line) only when the lineEdit gets the focus.
                            In addition, in the setLineEdit(), I would call this->setFocusProxy(line). In order to avoid your keyboard to steal the focus from your linedit.

                            A 1 Reply Last reply
                            0
                            • D deleted372

                              I would call lineEditkeyboard->setLineEdit(line) only when the lineEdit gets the focus.
                              In addition, in the setLineEdit(), I would call this->setFocusProxy(line). In order to avoid your keyboard to steal the focus from your linedit.

                              A Offline
                              A Offline
                              Arvind K
                              wrote on last edited by
                              #16

                              @JoZCaVaLLo
                              @mrjj
                              @J-Hilk
                              @dheerendra
                              one more thing to share when I called keyboard widget with a show() like
                              lineEditkeyboard->setLineEdit(line);
                              lineEditkeyboard->show();

                              the keyboard works properly but when I called Keyboard like

                              lineEditkeyboard->setLineEdit(line);
                              lineEditkeyboard->setWindowModality(Qt::ApplicationModal);
                              lineEditkeyboard->show();

                              then I face the same issue of the first click.

                              mrjjM 1 Reply Last reply
                              0
                              • A Arvind K

                                @JoZCaVaLLo
                                @mrjj
                                @J-Hilk
                                @dheerendra
                                one more thing to share when I called keyboard widget with a show() like
                                lineEditkeyboard->setLineEdit(line);
                                lineEditkeyboard->show();

                                the keyboard works properly but when I called Keyboard like

                                lineEditkeyboard->setLineEdit(line);
                                lineEditkeyboard->setWindowModality(Qt::ApplicationModal);
                                lineEditkeyboard->show();

                                then I face the same issue of the first click.

                                mrjjM Offline
                                mrjjM Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on last edited by
                                #17

                                @Arvind-K
                                hi, we need to find out what is happening.
                                please do
                                qDebug() << "focus widget " << qApp->focusObject();
                                which tells us when you open the keyboard, who has focus.
                                Meaning who will get the keys if u type.
                                I think you have something that steals keyboard focus when u open the
                                lineEditkeyboard

                                A 1 Reply Last reply
                                0
                                • mrjjM mrjj

                                  @Arvind-K
                                  hi, we need to find out what is happening.
                                  please do
                                  qDebug() << "focus widget " << qApp->focusObject();
                                  which tells us when you open the keyboard, who has focus.
                                  Meaning who will get the keys if u type.
                                  I think you have something that steals keyboard focus when u open the
                                  lineEditkeyboard

                                  A Offline
                                  A Offline
                                  Arvind K
                                  wrote on last edited by
                                  #18

                                  @mrjj

                                  as you said I have done same when keyboard widget is shown.
                                  output is

                                  DBG default: focus widget QLineEdit(0x227ca90, name = "lineEdit")

                                  lineEdit is Nothing but the QLineEdit on Keyboard widget.

                                  mrjjM 1 Reply Last reply
                                  0
                                  • A Arvind K

                                    @mrjj

                                    as you said I have done same when keyboard widget is shown.
                                    output is

                                    DBG default: focus widget QLineEdit(0x227ca90, name = "lineEdit")

                                    lineEdit is Nothing but the QLineEdit on Keyboard widget.

                                    mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #19

                                    @Arvind-K
                                    Ok so it does have the focus when first click is not registered?

                                    A 1 Reply Last reply
                                    0
                                    • mrjjM mrjj

                                      @Arvind-K
                                      Ok so it does have the focus when first click is not registered?

                                      A Offline
                                      A Offline
                                      Arvind K
                                      wrote on last edited by
                                      #20

                                      @mrjj

                                      Yes.
                                      after that when I click on Anywhere on Widget Nothing happen or no Any event gets called.

                                      mrjjM 1 Reply Last reply
                                      0
                                      • A Arvind K

                                        @mrjj

                                        Yes.
                                        after that when I click on Anywhere on Widget Nothing happen or no Any event gets called.

                                        mrjjM Offline
                                        mrjjM Offline
                                        mrjj
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #21

                                        @Arvind-K
                                        so the widget appear frozen for a moment ?
                                        Do you have any kind of loops in constructor or anything like that ?

                                        A 1 Reply Last reply
                                        0
                                        • mrjjM mrjj

                                          @Arvind-K
                                          so the widget appear frozen for a moment ?
                                          Do you have any kind of loops in constructor or anything like that ?

                                          A Offline
                                          A Offline
                                          Arvind K
                                          wrote on last edited by
                                          #22

                                          @mrjj

                                          No, there is no Loop in the constructor or No Any other code only I have connected signal to Slot.

                                          Keyboard::Keyboard(QWidget *parent) :
                                          QWidget(parent),
                                          ui(new Ui::Keyboard)
                                          {
                                          ui->setupUi(this);

                                          this->setWindowFlags(Qt::WindowStaysOnTopHint);
                                          connect ( ui->Buttonq, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonw, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttone, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonr, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttont, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttony, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonu, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttoni, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttono, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonp, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          
                                          connect ( ui->Buttona, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttons, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttond, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonf, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttong, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonh, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonj, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonk, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonl, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonz, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonx, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonc, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonv, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonb, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonn, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Buttonm, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button0, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button1, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button2, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button3, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button4, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button5, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button6, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button7, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button8, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->Button9, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          connect ( ui->space, SIGNAL( clicked() ), this, SLOT( keyboardHandler() ) );
                                          
                                          outputText = "";
                                          shift = false;
                                          

                                          }

                                          mrjjM 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