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. Hover event on QPushButton
Forum Updated to NodeBB v4.3 + New Features

Hover event on QPushButton

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 4 Posters 26.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.
  • S Offline
    S Offline
    Shodan
    wrote on 26 Aug 2017, 22:28 last edited by Shodan
    #3

    I tried but I did not really understant everything.

    In the .h file I declared a function called filterBtn1();

    #ifndef TEST_H
    #define TEST_H
    
    #include <QApplication>
    #include <QWidget>
    #include <QPixmap>
    #include <QPushButton>
    #include <QObject>
    #include <QHoverEvent>
    
    class myMainWindow : public QWidget
    {
        public:
        myMainWindow();
    
        public slots:
        void filterBtn1();
    
        private:
        QPushButton *btn1;
    };
    

    The main.cpp

    #include "Test.h"
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        myMainWindow mainWindow;
        mainWindow.setFixedSize(1024, 768);
        mainWindow.show();
    
        return app.exec();
    }
    

    Then I added an event filter: "btn1->installEventFilter(filterBtn1);"
    And I understood that I have to create a class in the .cpp file and set boolean conditions:
    From this point, the example of the Qt documentation is a bit to complicate for me.

    #include "Test.h"
    
    myMainWindow::myMainWindow() : QWidget()
    {
        btn1 = new QPushButton("", this);
        btn1->setGeometry(0, 150, 104, 103);
        btn1->setIcon(QIcon("btnLogs/1.jpg"));
        btn1->setIconSize(QSize(104, 103));
        btn1->installEventFilter(filterBtn1);
    }
    
    class filterBtn1 : public QObject
    {
        Q_OBJECT
    protected:
        bool eventFilter(QObject ???*, QEvent *???);
    };
    
    bool filterBtn1::eventFilter(QObject *???, QEvent *???)
    {
        if (event->type() == QEvent::HoverEnter) {
    btn1->setIcon(QIcon("btnLogs/1_hover.jpg"));
        } else {
    ???
        }
    }
    
    1 Reply Last reply
    0
    • S Offline
      S Offline
      Shodan
      wrote on 27 Aug 2017, 06:04 last edited by
      #4

      If someone could help me with that it would be great.

      1 Reply Last reply
      0
      • S Shodan
        26 Aug 2017, 22:00

        Hi.

        I want to change the icons of my buttons when mouse goes over it.
        They are created like this:

            btn1 = new QPushButton("", this);
            btn1->setGeometry(0, 150, 100, 100);
            btn1->setIcon(QIcon("btnLogs/1.jpg"));
            btn1->setIconSize(QSize(100, 100));
            QObject::connect(btn1, SIGNAL(clicked()), this, SLOT(slotBtn1()));
        

        Found the QEvent::HoverEnter and QEvent::HoverLeave events in the Qt documentation, but I fear that I will not get them to work without some help.

        I tried something like this for example:

            btn1->QEvent::HoverEnter;
            {
            btn1->setIcon(QIcon("btnLogs/1_hover.jpg"));
            }
            btn1->QEvent::HoverLeave;
            {
            btn1->setIcon(QIcon("btnLogs/1.jpg"));
            }
        

        It tells me that 'QEvent' is not a base of 'QPushButton' btn1->QEvent::HoverEnter;

        I didn't find an easy example for this on google.

        Thanks for your help.

        C Offline
        C Offline
        c64zottel
        wrote on 27 Aug 2017, 12:23 last edited by
        #5

        @Shodan said in Hover event on QPushButton:

        QPushButton

        As far as I see it, its quite similar as in Qml. You can use:
        void QWidget::enterEvent(QEvent *event)
        void QWidget::leaveEvent(QEvent *event)
        from here:
        http://doc.qt.io/qt-5/qpushbutton-members.html
        An event is sent to the widget when the mouse cursor enters the widget.
        A leave event is sent to the widget when the mouse cursor leaves the widget.

        1 Reply Last reply
        1
        • S Offline
          S Offline
          Shodan
          wrote on 27 Aug 2017, 20:03 last edited by
          #6

          @c64zottel

          I tried with those members like this:
          .h file

          #ifndef TEST2_H
          #define TEST2_H
          
          #include <QApplication>
          #include <QWidget>
          #include <QPushButton>
          
          
          class myMainWindow : public QWidget
          {
              Q_OBJECT
          
              public:
              myMainWindow();
              QPushButton *btn1;
          
              public slots:
              void enterEvent(QPushButton *btn1);
              void leaveEvent(QPushButton *btn1);
          
              private:
          };
          
          #endif // TEST2_H
          

          .cpp file

          #include "test2.h"
          
          myMainWindow::myMainWindow() : QWidget()
          {
              btn1 = new QPushButton("", this);
              btn1->setGeometry(0, 150, 104, 103);
              btn1->setIcon(QIcon("btnLogs/1.jpg"));
              btn1->setIconSize(QSize(104, 103));
          }
          
          void myMainWindow::enterEvent(QPushButton *btn1)
          {
              btn1->setIcon(QIcon("btnLogs/1_hover.jpg"));
          }
          
          void myMainWindow::leaveEvent(QPushButton *btn1)
          {
              btn1->setIcon(QIcon("btnLogs/1.jpg"));
          }
          

          No errors come up when I run the programm. Nothing happens when mouse goes over the button.
          I belive there is a connection to do with the button but I can't figure out how.
          At least I hope this is the right way to use void QWidget::enterEvent(QEvent *event).

          Thanks for your answers

          1 Reply Last reply
          0
          • S Offline
            S Offline
            SGaist
            Lifetime Qt Champion
            wrote on 27 Aug 2017, 20:48 last edited by
            #7

            With all due respect, it seems you have a lack of C++ knowledge regarding virtual method re-implementation.

            The methods you re-implement must have matching signatures.

            Did you read the documentation chapter about handling events I linked to ?

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

            1 Reply Last reply
            0
            • S Offline
              S Offline
              Shodan
              wrote on 27 Aug 2017, 21:24 last edited by
              #8

              Yes I know.
              I began with Qt only a few days ago :-)

              Of course I read id and tried to follow the examples.
              Since I am not english, many things are hard to understand.

              1 Reply Last reply
              0
              • S Offline
                S Offline
                SGaist
                Lifetime Qt Champion
                wrote on 27 Aug 2017, 22:02 last edited by
                #9

                Well, in this case, it has nothing to do with Qt but basic C++. See polymorphism.

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

                1 Reply Last reply
                1
                • C Offline
                  C Offline
                  c64zottel
                  wrote on 28 Aug 2017, 06:26 last edited by
                  #10

                  Ok, to test myself I did this in about 10 min. Since I can't upload a tar file, here is a link:
                  [https://www.file-upload.net/download-12680886/TestEnterLeaveEvent.tar.gz.html](link url)

                  For the sake of discussion and future references, here is the main code:

                  class CustomButton : public QPushButton
                  {
                      // QWidget interface
                  protected:
                      virtual void enterEvent(QEvent *) {
                          qDebug() << "entering";
                          QPalette pal = palette();
                          pal.setColor(QPalette::Button, QColor(Qt::blue));
                          setAutoFillBackground(true);
                          setPalette(pal);
                          update();
                      }
                  
                      virtual void leaveEvent(QEvent *) {
                          qDebug() << "leaving";
                          QPalette pal = palette();
                          pal.setColor(QPalette::Button, QColor(Qt::red));
                          setAutoFillBackground(true);
                          setPalette(pal);
                          update();
                      }
                  };
                  

                  The MainWindow has a pointer to a CustomButton, which is initialized in the ctor:

                  MainWindow::MainWindow(QWidget *parent) :
                      QMainWindow(parent),
                      ui(new Ui::MainWindow)
                  {
                      ui->setupUi(this);
                      cb = new CustomButton;
                  
                      cb->setText( "My funny button");
                      this->setCentralWidget( cb );
                  }
                  
                  J 1 Reply Last reply 28 Aug 2017, 06:53
                  1
                  • S Offline
                    S Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on 28 Aug 2017, 06:32 last edited by
                    #11

                    @c64zottel There's no need to call setAutoFileBackground in every function. That's typically something you do once in the constructor.

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

                    1 Reply Last reply
                    2
                    • C c64zottel
                      28 Aug 2017, 06:26

                      Ok, to test myself I did this in about 10 min. Since I can't upload a tar file, here is a link:
                      [https://www.file-upload.net/download-12680886/TestEnterLeaveEvent.tar.gz.html](link url)

                      For the sake of discussion and future references, here is the main code:

                      class CustomButton : public QPushButton
                      {
                          // QWidget interface
                      protected:
                          virtual void enterEvent(QEvent *) {
                              qDebug() << "entering";
                              QPalette pal = palette();
                              pal.setColor(QPalette::Button, QColor(Qt::blue));
                              setAutoFillBackground(true);
                              setPalette(pal);
                              update();
                          }
                      
                          virtual void leaveEvent(QEvent *) {
                              qDebug() << "leaving";
                              QPalette pal = palette();
                              pal.setColor(QPalette::Button, QColor(Qt::red));
                              setAutoFillBackground(true);
                              setPalette(pal);
                              update();
                          }
                      };
                      

                      The MainWindow has a pointer to a CustomButton, which is initialized in the ctor:

                      MainWindow::MainWindow(QWidget *parent) :
                          QMainWindow(parent),
                          ui(new Ui::MainWindow)
                      {
                          ui->setupUi(this);
                          cb = new CustomButton;
                      
                          cb->setText( "My funny button");
                          this->setCentralWidget( cb );
                      }
                      
                      J Offline
                      J Offline
                      J.Hilk
                      Moderators
                      wrote on 28 Aug 2017, 06:53 last edited by
                      #12

                      @c64zottel If it's just the background color you want to change, I would recomment the use of a StyleSheet:

                      QPushButton *btn = new QPushButton();
                      btn->setObjectName("btnName_1");
                      btn->show();
                      btn->setSteyleSheet(
                      "   QPushButton#btnName_1 {"
                      "     background-color: yellow;"
                      " }"
                      " QPushButton#btnName_1:pressed {"
                      "     background-color: rgb(224, 0, 0);     "
                      " }"
                      " QPushButton#btnName_1:hover {"
                      "     background-color: rgb(224, 255, 0);"
                      " }"
                      
                      "QPushButton#btnName_1:hover:pressed"
                      "{"
                      "    background-color:red;"
                      "}"
                      );
                      

                      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.

                      1 Reply Last reply
                      6
                      • S Offline
                        S Offline
                        Shodan
                        wrote on 28 Aug 2017, 19:35 last edited by
                        #13

                        I tried to change the button icon with a styleSheet like this:

                        #include "test2.h"
                        
                        myMainWindow::myMainWindow() : QWidget()
                        {
                            btn1 = new QPushButton("", this);
                            btn1->setGeometry(0, 150, 104, 103);
                            btn1->setObjectName("btn1_Name");
                            btn1->show();
                            btn1->setStyleSheet(
                            "   QPushButton#btn1_Name {"
                            "     background-image: url('btnLogs/1.jpg');"
                            " }"
                            " QPushButton#btn1_Name:pressed {"
                            "     background-image: url('btnLogs/1_pressed.jpg');"
                            " }"
                            " QPushButton#btn1_Name:hover {"
                            "     background-image: url('btnLogs/1_hover.jpg');"
                            " }"
                            "QPushButton#btn1_Name:hover:pressed"
                            "{"
                            "     background-image: url('btnLogs/1_pressed.jpg');"
                            "}"
                            );
                        }
                        

                        It seems to work, even better than expected since there are the "pressed" status within.
                        For what I want to do it's just great!

                        I'll try to do this using a event filter in my next programm, with a bit more experience in Qt.

                        Thanks all the people for your help with this.

                        Best regards :-}

                        1 Reply Last reply
                        3

                        12/13

                        28 Aug 2017, 06:53

                        • Login

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