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. How to get a if a KeySequence is pressed in main(); (While Application Launch)

How to get a if a KeySequence is pressed in main(); (While Application Launch)

Scheduled Pinned Locked Moved Unsolved General and Desktop
30 Posts 3 Posters 4.6k 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.
  • ademmlerA ademmler

    Ok, I changed the Splash creation to this and now I can read the message:

    QPixmap pixmap(100,100);
    pixmap.fill(Qt::white);
    QSplashScreen splash(pixmap);
    

    But still the KeyEvent does not get hit. Didi I forgot to include something important.

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #8

    @ademmler Where do you use MySplashScreen?

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    2
    • ademmlerA Offline
      ademmlerA Offline
      ademmler
      wrote on last edited by
      #9

      In main - because I want to get the KeyEvent before the MainWindow appears - see top to this thread.

      Pl45m4P jsulmJ 2 Replies Last reply
      0
      • ademmlerA ademmler

        In main - because I want to get the KeyEvent before the MainWindow appears - see top to this thread.

        Pl45m4P Offline
        Pl45m4P Offline
        Pl45m4
        wrote on last edited by Pl45m4
        #10

        @ademmler

        Urrgh... @jsulm is right...

        Your splash variable has the type QSplashScreen...
        You never create any instance of your custom MySplashScreen class, which handles the key event ;-)

        I totally missed that... My code should work now


        If debugging is the process of removing software bugs, then programming must be the process of putting them in.

        ~E. W. Dijkstra

        1 Reply Last reply
        0
        • ademmlerA ademmler

          In main - because I want to get the KeyEvent before the MainWindow appears - see top to this thread.

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #11

          @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

          In main

          no, you don't...

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • ademmlerA Offline
            ademmlerA Offline
            ademmler
            wrote on last edited by
            #12

            Ok guys - you have been right - but still it does not work. I changed within main() to:

            // Create a pixmap to show on the splash screen
            QPixmap pixmap(500,100);
            pixmap.fill(Qt::white);
            MySplashScreen splash(pixmap);
            splash.show();
            splash.raise();
            ... and so on

            jsulmJ Pl45m4P 2 Replies Last reply
            0
            • ademmlerA ademmler

              Ok guys - you have been right - but still it does not work. I changed within main() to:

              // Create a pixmap to show on the splash screen
              QPixmap pixmap(500,100);
              pixmap.fill(Qt::white);
              MySplashScreen splash(pixmap);
              splash.show();
              splash.raise();
              ... and so on

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #13

              @ademmler Maybe your splash screen does not have focus? Try to klick on it and then press a key.

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • ademmlerA ademmler

                Ok guys - you have been right - but still it does not work. I changed within main() to:

                // Create a pixmap to show on the splash screen
                QPixmap pixmap(500,100);
                pixmap.fill(Qt::white);
                MySplashScreen splash(pixmap);
                splash.show();
                splash.raise();
                ... and so on

                Pl45m4P Offline
                Pl45m4P Offline
                Pl45m4
                wrote on last edited by Pl45m4
                #14

                @ademmler

                This works for me:

                    QPixmap pixmap(500,100);
                    pixmap.fill(Qt::white);
                    MySplashScreen splash(pixmap);
                    splash.show();
                    QTimer::singleShot(3000, &app, [&]() {
                        // even with finish() outside the lamda,
                        // but then you have to be fast with pressing the key
                        splash.finish(&w);
                        app.processEvents(); // needed?!
                        w.show();
                    });
                

                @jsulm clicking will make the Splash screen disappear.
                The above code works for me on Windows without doing anything... Splash shows up, I spam ESC-key, I get dozens of Key pressed messages from my qDebug in SplashScreen's keyEvent handler.

                Edit:

                Weird that I don't even need the processEvents call... commented that line, still works.


                If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                ~E. W. Dijkstra

                ademmlerA 1 Reply Last reply
                0
                • ademmlerA Offline
                  ademmlerA Offline
                  ademmler
                  wrote on last edited by
                  #15

                  @jsulm Hi, when I do so the Splash window vanishes imdiatly. I tried also to use splash.setFocus ();

                  1 Reply Last reply
                  0
                  • Pl45m4P Pl45m4

                    @ademmler

                    This works for me:

                        QPixmap pixmap(500,100);
                        pixmap.fill(Qt::white);
                        MySplashScreen splash(pixmap);
                        splash.show();
                        QTimer::singleShot(3000, &app, [&]() {
                            // even with finish() outside the lamda,
                            // but then you have to be fast with pressing the key
                            splash.finish(&w);
                            app.processEvents(); // needed?!
                            w.show();
                        });
                    

                    @jsulm clicking will make the Splash screen disappear.
                    The above code works for me on Windows without doing anything... Splash shows up, I spam ESC-key, I get dozens of Key pressed messages from my qDebug in SplashScreen's keyEvent handler.

                    Edit:

                    Weird that I don't even need the processEvents call... commented that line, still works.

                    ademmlerA Offline
                    ademmlerA Offline
                    ademmler
                    wrote on last edited by ademmler
                    #16

                    @Pl45m4 Hi - thx again. I copied your code 1:1 and added "MainWindow w;" above.
                    when I am not mistaken I should get - as you do "Any key printed" as Debug message, because I have
                    a genial log message for any Key also.

                    But still - being on Mac OS - I do not get a Debug() message and also, when I run in Debugger mode, the routine gets never hit.

                    I ll try on windows - for cross test now ...

                    jsulmJ 1 Reply Last reply
                    0
                    • ademmlerA ademmler

                      @Pl45m4 Hi - thx again. I copied your code 1:1 and added "MainWindow w;" above.
                      when I am not mistaken I should get - as you do "Any key printed" as Debug message, because I have
                      a genial log message for any Key also.

                      But still - being on Mac OS - I do not get a Debug() message and also, when I run in Debugger mode, the routine gets never hit.

                      I ll try on windows - for cross test now ...

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #17

                      @ademmler Try to play with some flags like: Qt::WindowTransparentForInput and Qt::WindowDoesNotAcceptFocus. Maybe on Mac splash screen does not accept key events by default.

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0
                      • ademmlerA Offline
                        ademmlerA Offline
                        ademmler
                        wrote on last edited by
                        #18

                        Hi, to both of you - I can approve on Windows 11 it is working as expected.
                        Hence the question is whats needed for MacOS to get it work or is it a Bug ...

                        @jsulm Yep I will test the flags and let you know.

                        Pl45m4P 1 Reply Last reply
                        0
                        • ademmlerA ademmler

                          Hi, to both of you - I can approve on Windows 11 it is working as expected.
                          Hence the question is whats needed for MacOS to get it work or is it a Bug ...

                          @jsulm Yep I will test the flags and let you know.

                          Pl45m4P Offline
                          Pl45m4P Offline
                          Pl45m4
                          wrote on last edited by Pl45m4
                          #19

                          @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

                          Hence the question is whats needed for MacOS to get it work or is it a Bug ...

                          Either bug or just how it works on Mac...

                          See:
                          (also includes a workaround... )

                          • https://stackoverflow.com/questions/23728058/get-keypresses-in-qsplashscreen-on-osx

                          maybe worth a try if you are fine with creating an empty widget/window before the splashscreen is created


                          If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                          ~E. W. Dijkstra

                          ademmlerA 1 Reply Last reply
                          0
                          • Pl45m4P Pl45m4

                            @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

                            Hence the question is whats needed for MacOS to get it work or is it a Bug ...

                            Either bug or just how it works on Mac...

                            See:
                            (also includes a workaround... )

                            • https://stackoverflow.com/questions/23728058/get-keypresses-in-qsplashscreen-on-osx

                            maybe worth a try if you are fine with creating an empty widget/window before the splashscreen is created

                            ademmlerA Offline
                            ademmlerA Offline
                            ademmler
                            wrote on last edited by ademmler
                            #20

                            @Pl45m4 Hi, thx for pointing me to the stack overflow thread. I have tried two things:

                            1. I just added this splash.grabKeyboard();:
                              In this case the key event gets hit, when MainWindow is active.

                            2. The solution from stack overflow is adding a "hidden" window before the Splashscreen is called.
                              But also in this case the key event gets hit, when MainWindow is active. This would have a negative effect on the Main Application for sure.

                            Maybe the simplest way is to create my Own "Dialog" or Framless Widget as a Splashscreen replacement ...
                            The Event filter should be no longer active, when the dialog has been closed - right?

                            Pl45m4P 1 Reply Last reply
                            0
                            • ademmlerA ademmler

                              @Pl45m4 Hi, thx for pointing me to the stack overflow thread. I have tried two things:

                              1. I just added this splash.grabKeyboard();:
                                In this case the key event gets hit, when MainWindow is active.

                              2. The solution from stack overflow is adding a "hidden" window before the Splashscreen is called.
                                But also in this case the key event gets hit, when MainWindow is active. This would have a negative effect on the Main Application for sure.

                              Maybe the simplest way is to create my Own "Dialog" or Framless Widget as a Splashscreen replacement ...
                              The Event filter should be no longer active, when the dialog has been closed - right?

                              Pl45m4P Offline
                              Pl45m4P Offline
                              Pl45m4
                              wrote on last edited by Pl45m4
                              #21

                              @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

                              I just added this splash.grabKeyboard();:
                              In this case the key event gets hit, when MainWindow is active.

                              This part of the solution is not relevant for you.

                              The solution from stack overflow is adding a "hidden" window before the Splashscreen is called.
                              But also in this case the key event gets hit, when MainWindow is active. This would have a negative effect on the Main Application for sure.

                              I was talking about this part.
                              Can't test it, as I don't use any Mac, but how should this influence your main window?!
                              You do literally nothing with this label... it's just there to somehow bypass the Mac behavior.
                              You don't even see it, because it has no size and is hidden when you show your main app.
                              Otherwise I'm out of ideas.
                              You could try another widget instead of QSplashScreen but you said, you want to use a splashscreen for your app anyway.

                                  // Create a dummy window so that we get keypresses on OSX
                                  QLabel v(0, Qt::FramelessWindowHint);
                                  v.setMinimumSize(QSize(0, 0));
                                  v.move(0,0);
                                  v.show();
                                 
                                  // ...
                                  // your code
                              
                                  v.hide();
                              

                              If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                              ~E. W. Dijkstra

                              ademmlerA 1 Reply Last reply
                              0
                              • Pl45m4P Pl45m4

                                @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

                                I just added this splash.grabKeyboard();:
                                In this case the key event gets hit, when MainWindow is active.

                                This part of the solution is not relevant for you.

                                The solution from stack overflow is adding a "hidden" window before the Splashscreen is called.
                                But also in this case the key event gets hit, when MainWindow is active. This would have a negative effect on the Main Application for sure.

                                I was talking about this part.
                                Can't test it, as I don't use any Mac, but how should this influence your main window?!
                                You do literally nothing with this label... it's just there to somehow bypass the Mac behavior.
                                You don't even see it, because it has no size and is hidden when you show your main app.
                                Otherwise I'm out of ideas.
                                You could try another widget instead of QSplashScreen but you said, you want to use a splashscreen for your app anyway.

                                    // Create a dummy window so that we get keypresses on OSX
                                    QLabel v(0, Qt::FramelessWindowHint);
                                    v.setMinimumSize(QSize(0, 0));
                                    v.move(0,0);
                                    v.show();
                                   
                                    // ...
                                    // your code
                                
                                    v.hide();
                                
                                ademmlerA Offline
                                ademmlerA Offline
                                ademmler
                                wrote on last edited by ademmler
                                #22

                                @Pl45m4 Yes and yes - but even if this label has been hidden the KeyEvent get still caught within the MainWindow ...
                                Hence if the user presses ESC, while in the MainWindow again, the same/associated action will take place again.
                                This is not what wanted.

                                Pl45m4P 1 Reply Last reply
                                0
                                • ademmlerA ademmler

                                  @Pl45m4 Yes and yes - but even if this label has been hidden the KeyEvent get still caught within the MainWindow ...
                                  Hence if the user presses ESC, while in the MainWindow again, the same/associated action will take place again.
                                  This is not what wanted.

                                  Pl45m4P Offline
                                  Pl45m4P Offline
                                  Pl45m4
                                  wrote on last edited by
                                  #23

                                  @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

                                  even if this label has been hidden the KeyEvent get still caught within the MainWindow ...
                                  Hence if the user presses ESC, while in the MainWindow again, the same/associated action will take place again.

                                  Have you tried it already?
                                  Again:
                                  I'm not able to test it, but the label does nothing, except fooling the Mac Window System to process input events (seems like it).
                                  The label does not react on any key event or print any messages.
                                  You just add the label to your code. Show it before you show the splash, hide it with the splash before the main window shows up.
                                  Does it work now?


                                  If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                  ~E. W. Dijkstra

                                  1 Reply Last reply
                                  0
                                  • ademmlerA Offline
                                    ademmlerA Offline
                                    ademmler
                                    wrote on last edited by
                                    #24

                                    Yes I tried it allready! And it is as I said - the KeyEvent gets MainWindow ...

                                    1 Reply Last reply
                                    0
                                    • ademmlerA Offline
                                      ademmlerA Offline
                                      ademmler
                                      wrote on last edited by
                                      #25

                                      @Pl45m4 thx for your patience.

                                      Using a custom Widget could work, but when MainWindow is to be shown the Application crashes.
                                      I am not very familiar with LAMBDA functions. May I did it wrong.

                                      SplashWidget *splash = new SplashWidget;
                                         splash->show();
                                         splash->raise();
                                         splash->setFocus();
                                      
                                         MainWindow w;
                                         QTimer::singleShot(3000, [&]() {
                                             splash->close();
                                             app.processEvents();
                                             w.show();
                                         });
                                      
                                      Pl45m4P 1 Reply Last reply
                                      0
                                      • ademmlerA ademmler

                                        @Pl45m4 thx for your patience.

                                        Using a custom Widget could work, but when MainWindow is to be shown the Application crashes.
                                        I am not very familiar with LAMBDA functions. May I did it wrong.

                                        SplashWidget *splash = new SplashWidget;
                                           splash->show();
                                           splash->raise();
                                           splash->setFocus();
                                        
                                           MainWindow w;
                                           QTimer::singleShot(3000, [&]() {
                                               splash->close();
                                               app.processEvents();
                                               w.show();
                                           });
                                        
                                        Pl45m4P Offline
                                        Pl45m4P Offline
                                        Pl45m4
                                        wrote on last edited by Pl45m4
                                        #26

                                        @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

                                        SplashWidget *splash = new SplashWidget;
                                        

                                        You allocate the widget on the heap

                                        QTimer::singleShot(3000, [&]() {
                                        

                                        and capture it by reference.

                                        Keep it on the stack (dont create pointer)
                                        It's a bad habit to allocate everything on the heap when not needed at all
                                        (minimize heap allocations)

                                        You can also safely remove the processEvents() call.


                                        If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                        ~E. W. Dijkstra

                                        ademmlerA 1 Reply Last reply
                                        0
                                        • Pl45m4P Pl45m4

                                          @ademmler said in How to get a if a KeySequence is pressed in main(); (While Application Launch):

                                          SplashWidget *splash = new SplashWidget;
                                          

                                          You allocate the widget on the heap

                                          QTimer::singleShot(3000, [&]() {
                                          

                                          and capture it by reference.

                                          Keep it on the stack (dont create pointer)
                                          It's a bad habit to allocate everything on the heap when not needed at all
                                          (minimize heap allocations)

                                          You can also safely remove the processEvents() call.

                                          ademmlerA Offline
                                          ademmlerA Offline
                                          ademmler
                                          wrote on last edited by
                                          #27

                                          @Pl45m4
                                          Do I understand right - you want me to do this:

                                          SplashWidget splash;
                                              splash.show();
                                              splash.raise();
                                              splash.setFocus();
                                          
                                              MainWindow w;
                                              QTimer::singleShot(3000, [&]() {
                                                  splash.close();
                                                  w.show();
                                              });
                                          

                                          When I keep a key (any) pressed the Application crashes immediately, after the SplashWidget had been closed.

                                          8 QtCore 0x109aa8e9d qt_message_output(QtMsgType, QMessageLogContext const&, QString const&) + 13 (qlogging.cpp:1937)
                                          9 QtCore 0x109bb5118 QDebug::~QDebug() + 104 (qdebug.cpp:154)
                                          10 SplashCommand 0x107be933f SplashWidget::keyPressEvent(QKeyEvent*) + 159 (splashwidget.cpp:17)
                                          11 SplashCommand 0x107be9403 SplashWidget::keyPressEvent(QKeyEvent*) + 355 (splashwidget.cpp:22)
                                          .... many more

                                          Pl45m4P 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