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

Hover event on QPushButton

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 4 Posters 27.9k 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.
  • ShodanS Offline
    ShodanS Offline
    Shodan
    wrote on last edited by
    #4

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

    1 Reply Last reply
    0
    • ShodanS Shodan

      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 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
      • ShodanS Offline
        ShodanS Offline
        Shodan
        wrote on 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
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on 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
          • ShodanS Offline
            ShodanS Offline
            Shodan
            wrote on 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
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on 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 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.HilkJ 1 Reply Last reply
                1
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on 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

                    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.HilkJ Offline
                    J.HilkJ Offline
                    J.Hilk
                    Moderators
                    wrote on 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
                    • ShodanS Offline
                      ShodanS Offline
                      Shodan
                      wrote on 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

                      • Login

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