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. Key press (arrow keys) cause loss of focus
Forum Updated to NodeBB v4.3 + New Features

Key press (arrow keys) cause loss of focus

Scheduled Pinned Locked Moved Solved General and Desktop
30 Posts 5 Posters 5.9k Views 4 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.
  • PerdrixP Perdrix

    @Axel-Spoerl I put this in my Event Logging code:

        case QEvent::FocusOut:
            inputType = FOCUS;
            eventType = "FocusOut";
            if (tableView == obj) __debugbreak();
            break;
    

    When the breakpoint is hit I think the relevant part of the call stack is:

    b75a63ec-94b8-446d-a1c8-15b897cfdae4-image.png

    where the focus change is being driven from QGuiApplicationPrivate::processActivatedEvent() at line 2562. At that point in the code, newFocus is a null pointer and previousFocusObject -> my table view object.

    So why is the code forcing a focus change?

    David

    Axel SpoerlA Offline
    Axel SpoerlA Offline
    Axel Spoerl
    Moderators
    wrote on last edited by
    #21

    @Perdrix
    That baffles me. Can you step into Qt code?
    Or isolate the issue in a minimal reproducer?

    Software Engineer
    The Qt Company, Oslo

    PerdrixP 1 Reply Last reply
    0
    • Axel SpoerlA Axel Spoerl

      @Perdrix
      That baffles me. Can you step into Qt code?
      Or isolate the issue in a minimal reproducer?

      PerdrixP Offline
      PerdrixP Offline
      Perdrix
      wrote on last edited by Perdrix
      #22

      @Axel-Spoerl I can step into and put breakpoints into the Qt code.

      Please tell me where you want the breakpoints and what information you need

      Axel SpoerlA 1 Reply Last reply
      0
      • PerdrixP Perdrix

        @Axel-Spoerl I can step into and put breakpoints into the Qt code.

        Please tell me where you want the breakpoints and what information you need

        Axel SpoerlA Offline
        Axel SpoerlA Offline
        Axel Spoerl
        Moderators
        wrote on last edited by
        #23

        @Perdrix
        If you can compile Qt, throw a qDebug() << __FUNCTION__ << typeinto the c'tor of QFocusEvent (qevent.cpp:1562).
        Set a break point there and continue, unless it's a QEvent::FocusOut. If it's the FocusOut, that eventually steals focus, the call stack will tell who it is.

        Software Engineer
        The Qt Company, Oslo

        PerdrixP 1 Reply Last reply
        0
        • Axel SpoerlA Axel Spoerl

          @Perdrix
          If you can compile Qt, throw a qDebug() << __FUNCTION__ << typeinto the c'tor of QFocusEvent (qevent.cpp:1562).
          Set a break point there and continue, unless it's a QEvent::FocusOut. If it's the FocusOut, that eventually steals focus, the call stack will tell who it is.

          PerdrixP Offline
          PerdrixP Offline
          Perdrix
          wrote on last edited by
          #24

          @Axel-Spoerl :

          d9316882-fba3-4b20-b1df-8b73ae72d369-image.png

          The reason in the focus event is 3 (Qt::ActiveWindowFocusReason).

          This was invoked indirectly from line 1940 in QApplicationPrivate::notifyActiveWindowChange() 239a6261-53c2-480c-aca5-36ff2ed765a2-image.png

          David

          Axel SpoerlA 1 Reply Last reply
          0
          • PerdrixP Perdrix

            @Axel-Spoerl :

            d9316882-fba3-4b20-b1df-8b73ae72d369-image.png

            The reason in the focus event is 3 (Qt::ActiveWindowFocusReason).

            This was invoked indirectly from line 1940 in QApplicationPrivate::notifyActiveWindowChange() 239a6261-53c2-480c-aca5-36ff2ed765a2-image.png

            David

            Axel SpoerlA Offline
            Axel SpoerlA Offline
            Axel Spoerl
            Moderators
            wrote on last edited by
            #25

            @Perdrix said in Key press (arrow keys) cause loss of focus:

            The reason in the focus event is 3 (Qt::ActiveWindowFocusReason).

            That's interesting. What's the QWidget *focus argument pointing to?
            Shouldn't be nullptr with ActiveWindowFocusReason...

            Software Engineer
            The Qt Company, Oslo

            PerdrixP 1 Reply Last reply
            0
            • Axel SpoerlA Axel Spoerl

              @Perdrix said in Key press (arrow keys) cause loss of focus:

              The reason in the focus event is 3 (Qt::ActiveWindowFocusReason).

              That's interesting. What's the QWidget *focus argument pointing to?
              Shouldn't be nullptr with ActiveWindowFocusReason...

              PerdrixP Offline
              PerdrixP Offline
              Perdrix
              wrote on last edited by Perdrix
              #26

              @Axel-Spoerl It's pointing to a QScrollArea object (which could be the scroll area in the other dock widget)

              Axel SpoerlA 1 Reply Last reply
              0
              • PerdrixP Perdrix

                @Axel-Spoerl It's pointing to a QScrollArea object (which could be the scroll area in the other dock widget)

                Axel SpoerlA Offline
                Axel SpoerlA Offline
                Axel Spoerl
                Moderators
                wrote on last edited by
                #27

                @Perdrix
                Getting more and more interesting.
                Could you assign a QObject::objectName()to the suspicious scroll area? That will become visible in the debugger, so you can easily identify which one it is. Looks like the arrow key event gets delivered to another dock widget, which then consumes the event in an attempt to scroll. Eventually it gets focus as a stray bullet.

                Software Engineer
                The Qt Company, Oslo

                PerdrixP 1 Reply Last reply
                0
                • Axel SpoerlA Axel Spoerl

                  @Perdrix
                  Getting more and more interesting.
                  Could you assign a QObject::objectName()to the suspicious scroll area? That will become visible in the debugger, so you can easily identify which one it is. Looks like the arrow key event gets delivered to another dock widget, which then consumes the event in an attempt to scroll. Eventually it gets focus as a stray bullet.

                  PerdrixP Offline
                  PerdrixP Offline
                  Perdrix
                  wrote on last edited by
                  #28

                  @Axel-Spoerl The variable focusWidget set at line 1937 in QApplicationPrivate::notifyActiveWindowChange() points to the QMainWindow derived class for the application. The code then calls setActiveWindow() for that.

                  By the time this all gets to the actual Event Filter code the object to which focus is being given is the scroll area that belongs to the "other" dock widget.

                  I can recreate the problem without use of arrow keys - just clicking on a row in the table view selects it and starts the loading of the image. Just after the loading of the image completes, the focus is lost. The code that executes in my application on completion of loading the image was posted earlier in this thread.

                  PerdrixP 1 Reply Last reply
                  0
                  • PerdrixP Perdrix

                    @Axel-Spoerl The variable focusWidget set at line 1937 in QApplicationPrivate::notifyActiveWindowChange() points to the QMainWindow derived class for the application. The code then calls setActiveWindow() for that.

                    By the time this all gets to the actual Event Filter code the object to which focus is being given is the scroll area that belongs to the "other" dock widget.

                    I can recreate the problem without use of arrow keys - just clicking on a row in the table view selects it and starts the loading of the image. Just after the loading of the image completes, the focus is lost. The code that executes in my application on completion of loading the image was posted earlier in this thread.

                    PerdrixP Offline
                    PerdrixP Offline
                    Perdrix
                    wrote on last edited by
                    #29

                    @Axel-Spoerl I found the problem!!!

                    The code that was called on completion of loading of the image contained the following:

                    if (pToolBar->rectAction->isChecked())
                    {
                    	editStars->rectButtonPressed();
                    	selectRect->rectButtonPressed();
                    }
                    else if (pToolBar->starsAction->isChecked())
                    {
                    	editStars->starsButtonPressed();
                    	selectRect->starsButtonPressed();
                    }
                    else if (pToolBar->cometAction->isChecked())
                    {
                    	editStars->cometButtonPressed();
                    	selectRect->cometButtonPressed();
                    }
                    

                    each of the xxxxButtonPressed() member functions called activateWindow(); which in the end resulted in the table view losing focus. I removed the activateWindow(); calls and now it works as it should.

                    Thank you so much for your help - without it I would probably still be struggling with this for many weeks to come.

                    Axel SpoerlA 1 Reply Last reply
                    1
                    • PerdrixP Perdrix has marked this topic as solved on
                    • PerdrixP Perdrix

                      @Axel-Spoerl I found the problem!!!

                      The code that was called on completion of loading of the image contained the following:

                      if (pToolBar->rectAction->isChecked())
                      {
                      	editStars->rectButtonPressed();
                      	selectRect->rectButtonPressed();
                      }
                      else if (pToolBar->starsAction->isChecked())
                      {
                      	editStars->starsButtonPressed();
                      	selectRect->starsButtonPressed();
                      }
                      else if (pToolBar->cometAction->isChecked())
                      {
                      	editStars->cometButtonPressed();
                      	selectRect->cometButtonPressed();
                      }
                      

                      each of the xxxxButtonPressed() member functions called activateWindow(); which in the end resulted in the table view losing focus. I removed the activateWindow(); calls and now it works as it should.

                      Thank you so much for your help - without it I would probably still be struggling with this for many weeks to come.

                      Axel SpoerlA Offline
                      Axel SpoerlA Offline
                      Axel Spoerl
                      Moderators
                      wrote on last edited by
                      #30

                      @Perdrix
                      Hi David,
                      glad that the issue is resolved!
                      Thanks for letting me know - was a pleasure.
                      Cheers
                      Axel

                      Software Engineer
                      The Qt Company, Oslo

                      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