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. using QKeyEvents
Forum Updated to NodeBB v4.3 + New Features

using QKeyEvents

Scheduled Pinned Locked Moved Solved General and Desktop
40 Posts 4 Posters 5.8k 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.
  • mzimmersM Offline
    mzimmersM Offline
    mzimmers
    wrote on last edited by
    #27

    OK...I added the explicit connection in widget.cpp:

        connect(ui->pushButtonNics, &QPushButton::clicked, this, &Widget::on_pushButtonNics_clicked);
    

    Here's my widget.ui:

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>Widget</class>
     <widget class="QWidget" name="Widget">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>320</width>
        <height>160</height>
       </rect>
      </property>
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
      <property name="minimumSize">
       <size>
        <width>320</width>
        <height>160</height>
       </size>
      </property>
      <property name="windowTitle">
       <string>Discovery Utility</string>
      </property>
      <widget class="QPushButton" name="pushButtonNics">
       <property name="geometry">
        <rect>
         <x>130</x>
         <y>50</y>
         <width>75</width>
         <height>23</height>
        </rect>
       </property>
       <property name="text">
        <string>NICs</string>
       </property>
      </widget>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>
    

    And, just for good measure, here's main.cpp:

    #include <QApplication>
    
    #include <stdio.h>
    
    #include "widget.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int rc;
        QApplication a(argc, argv);
        Widget *widget;
    
        widget = new Widget();
        widget->show();
        rc = a.exec();
        return rc;
    }
    

    This is my entire project, except for the pro file itself:

    QT       += core gui network serialport xml
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = discovery_utility_test
    DEFINES += QT_DEPRECATED_WARNINGS
    SOURCES += \
    	keypress.cpp \
    	main.cpp \
    	nics.cpp \
    	widget.cpp
    
    HEADERS += \
    	keypress.h \
    	nics.h \
    	widget.h \
    
    FORMS += \
    	nics.ui \
    	widget.ui
    

    Could it possibly be due to the way that I'm building it? Or, maybe a Windows issue (you're testing on Linux, right)?

    Thanks...

    1 Reply Last reply
    0
    • mzimmersM Offline
      mzimmersM Offline
      mzimmers
      wrote on last edited by
      #28

      This problem has to do with setting the button's visibility. If I disable this line in my widget c'tor:

      //    ui->pushButtonNics->setVisible(false);
      

      My slot receives the signal, and opens the Nics dialog. After the dialog closes, I set the button to not visible, and the problem recurs.

      This problem exists on Windows 10, but not on MacOS. Could it be a bug?

      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #29

        One silly test, did you try to make the button invisible after calling connect. AFAIK, it should have no relation but it's worth a shot.

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        mzimmersM 1 Reply Last reply
        0
        • SGaistS SGaist

          One silly test, did you try to make the button invisible after calling connect. AFAIK, it should have no relation but it's worth a shot.

          mzimmersM Offline
          mzimmersM Offline
          mzimmers
          wrote on last edited by
          #30

          @SGaist yes, that's how I had it:

          Widget::Widget(QWidget *parent) :
              QWidget(parent),
              ui(new Ui::Widget)
          {
              ui->setupUi(this);
          
              // create and connect a KeyPress object.
              m_keyPress = new KeyPress(this);
              connect(m_keyPress, &KeyPress::keyEvent, this, &Widget::handleKeyEvent);
              connect(ui->pushButtonNics, &QPushButton::clicked, this, &Widget::on_pushButtonNics_clicked);
              installEventFilter(m_keyPress);
          
              // hide the button for the NICs window.
          //    ui->pushButtonNics->setVisible(false);
          }
          
          1 Reply Last reply
          0
          • mzimmersM Offline
            mzimmersM Offline
            mzimmers
            wrote on last edited by
            #31

            Update: I submitted a bug report on this; no movement on it yet.

            One of my users noticed that the application is now rather CPU-intensive. I verified that it was the key filter by disabling this code in my main widget:

                m_keyPress = new KeyPress(this);
                connect(m_keyPress, &KeyPress::keyEvent, this, &Widget::handleKeyEvent);
                installEventFilter(m_keyPress);
            

            Here's the filter:

            bool KeyPress::eventFilter(QObject *obj, QEvent *ev)
            {
                Q_UNUSED(obj)
            
                bool rc = false;
                int key;
                QKeyEvent *qke;
                QEvent::Type type = ev->type();
                if (type == QEvent::ShortcutOverride || type == QEvent::KeyRelease)
                {
                    qke = static_cast<QKeyEvent *>(ev);
                    key = qke->key();
            
                    // don't bother signaling when the key isn't meaningful to us.
                    if (key == 'c' || key == 'C' || key == 'd' || key == 'D')
                    {
                        emit keyEvent(*ev, key);
                    }
                    rc = true;
                }
                else
                {
                    rc = QObject::eventFilter(obj, ev);
                }
                return rc;
            }
            

            I don't see anything really inefficient in my code, but with this enabled, the app uses ~15% of my CPU (on an i3) at idle. Is this to be expected, or am I doing something wrong?

            Thanks...

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #32

              What type of widgets are you checking ?
              You can add an additional check for the obj parameter class to avoid further checks.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              JonBJ mzimmersM 2 Replies Last reply
              0
              • SGaistS SGaist

                What type of widgets are you checking ?
                You can add an additional check for the obj parameter class to avoid further checks.

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #33

                @SGaist
                If @mzimmers says:

                but with this enabled, the app uses ~15% of my CPU (on an i3) at idle

                assuming "idle" means not pressing any key, why is this KeyPress::eventFilter() being hit at all, let alone loads of times to use that CPU?

                mzimmersM 1 Reply Last reply
                0
                • SGaistS SGaist

                  What type of widgets are you checking ?
                  You can add an additional check for the obj parameter class to avoid further checks.

                  mzimmersM Offline
                  mzimmersM Offline
                  mzimmers
                  wrote on last edited by
                  #34

                  @SGaist well, maybe that's my problem -- I'm checking the entire QWidget. (The idea was to reveal hidden buttons when certain keys were pressed.) Given that, I'm not sure there's any meaningful obj parameter checking I can do.

                  1 Reply Last reply
                  0
                  • JonBJ JonB

                    @SGaist
                    If @mzimmers says:

                    but with this enabled, the app uses ~15% of my CPU (on an i3) at idle

                    assuming "idle" means not pressing any key, why is this KeyPress::eventFilter() being hit at all, let alone loads of times to use that CPU?

                    mzimmersM Offline
                    mzimmersM Offline
                    mzimmers
                    wrote on last edited by
                    #35

                    @JonB I suspect I'm doing something wrong with my use of the filter, but I'm not sure what to change. I think my filterEvent() is being called for all events, not just for key events.

                    JonBJ 1 Reply Last reply
                    0
                    • mzimmersM mzimmers

                      @JonB I suspect I'm doing something wrong with my use of the filter, but I'm not sure what to change. I think my filterEvent() is being called for all events, not just for key events.

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by
                      #36

                      @mzimmers said in using QKeyEvents:

                      I think my filterEvent() is being called for all events, not just for key events.

                      I suspect that is more like it ;-) I would worry about that before anything else :)

                      Use a debugger or qDebug()s to at least see when your filter is being hit, when the user isn't doing anything?

                      mzimmersM 1 Reply Last reply
                      0
                      • JonBJ JonB

                        @mzimmers said in using QKeyEvents:

                        I think my filterEvent() is being called for all events, not just for key events.

                        I suspect that is more like it ;-) I would worry about that before anything else :)

                        Use a debugger or qDebug()s to at least see when your filter is being hit, when the user isn't doing anything?

                        mzimmersM Offline
                        mzimmersM Offline
                        mzimmers
                        wrote on last edited by
                        #37

                        @JonB

                            qDebug() << QTime::currentTime().toString();
                        

                        Got about 6000 hits in ~2 seconds of run time. That explains the CPU usage.

                        I have no idea what could possibly be generating that many events, though.

                        JonBJ 1 Reply Last reply
                        0
                        • mzimmersM mzimmers

                          @JonB

                              qDebug() << QTime::currentTime().toString();
                          

                          Got about 6000 hits in ~2 seconds of run time. That explains the CPU usage.

                          I have no idea what could possibly be generating that many events, though.

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by
                          #38

                          @mzimmers
                          Start by debugging out ev->type()!

                          mzimmersM 1 Reply Last reply
                          0
                          • JonBJ JonB

                            @mzimmers
                            Start by debugging out ev->type()!

                            mzimmersM Offline
                            mzimmersM Offline
                            mzimmers
                            wrote on last edited by mzimmers
                            #39

                            @JonB the great majority were:

                            QEvent::UpdateRequest
                            QEvent::Paint

                            UPDATE: I managed to eliminate the flood of events, but...that didn't have an effect on my CPU usage. The problem is definitely in the KeyEvent class -- when I comment it out, CPU usage is nil. Anyone have any ideas?

                            1 Reply Last reply
                            0
                            • mzimmersM Offline
                              mzimmersM Offline
                              mzimmers
                              wrote on last edited by
                              #40

                              Update on this, documented here

                              The behaviour is different because clicked is emitted on button down on macOS, but on button up on the other two[Windows and Linux]. While the keyboard keys are down, the QPushButton stays down. That's a UX difference caused by how the OS itself behaves.

                              So, my idea for using the keys goes out the window...I'll think of something else.

                              The performance issue is a mystery, but I'm going to open a new thread on that. Thanks to everyone for looking.

                              1 Reply Last reply
                              1

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved