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. QPushButton in a Widget
QtWS25 Last Chance

QPushButton in a Widget

Scheduled Pinned Locked Moved Solved General and Desktop
4 Posts 3 Posters 260 Views
  • 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.
  • V Offline
    V Offline
    viniltc
    wrote on last edited by
    #1

    Hi,
    I've a bug somehere in the code not able to find.

    I've a widget class CustomPushButtonWidget, which has two PushButtons to increment or decrement the value by 2. I have modified the widget class to add more functionality, one of which is to detect a Key press (Up/Down key) and change the value accordingly.
    I have defined the CustomPushButtonWidget as follows:

    .h

    // custompushbuttonwidget.h
    
    #ifndef CUSTOMPUSHBUTTONWIDGET_H
    #define CUSTOMPUSHBUTTONWIDGET_H
    
    #include <QWidget>
    #include <QKeyEvent>
    #include <QMouseEvent>
    #include <QFrame>
    #include <QPainter>
    #include <QTimer>
    
    namespace Ui {
    class CustomPushButtonWidget;
    }
    
    class CustomPushButtonWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit CustomPushButtonWidget(QWidget *parent = nullptr);
        ~CustomPushButtonWidget();
    
        int getValue() const;
    
    signals:
        void valueChanged(int newValue);
    
    private slots:
        void on_btnIncrement_clicked();
        void on_btnDecrement_clicked();
    
    private:
        Ui::CustomPushButtonWidget *ui;
        int value;
        void setValue(int newValue);
        void keyPressEvent(QKeyEvent *event);
        void updateEnabled();
        bool enabled;  // New private member
        bool buttonClicked;
    
    
    
    protected:
        void focusInEvent(QFocusEvent* event) override;
        void focusOutEvent(QFocusEvent* event) override;
        void mousePressEvent(QMouseEvent* event) override;
        void paintEvent(QPaintEvent *event) override;
       
    
    };
    
    #endif // CUSTOMPUSHBUTTONWIDGET_H
    
    
    

    .cpp

    // custompushbuttonwidget.cpp
    
    #include "custompushbuttonwidget.h"
    #include "ui_custompushbuttonwidget.h"
    
    CustomPushButtonWidget::CustomPushButtonWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::CustomPushButtonWidget),
        enabled(false)
    {
        ui->setupUi(this);
        setValue(7);
    
        this->setObjectName("customWidget"); // set object name
        this->setFocusPolicy(Qt::ClickFocus);
        this->setStyleSheet("#customWidget {border: 1px solid gray;}");
    
        connect(ui->btnIncrement, &QPushButton::clicked, this, &CustomPushButtonWidget::on_btnIncrement_clicked);
        connect(ui->btnDecrement, &QPushButton::clicked, this, &CustomPushButtonWidget::on_btnDecrement_clicked);
    }
    
    CustomPushButtonWidget::~CustomPushButtonWidget()
    {
        delete ui;
    }
    
    int CustomPushButtonWidget::getValue() const
    {
        return value;
    }
    
    void CustomPushButtonWidget::on_btnIncrement_clicked()
    {
        if (value + 2 <= 120) { // only increment if result is within range
            value += 2;
            ui->lblValue->setText(QString::number(value));
            emit valueChanged(value);
        }
    }
    
    void CustomPushButtonWidget::on_btnDecrement_clicked()
    {
        if (value - 2 >= 7) { // only decrement if result is within range
            value -= 2;
            ui->lblValue->setText(QString::number(value));
            emit valueChanged(value);
        }
    }
    
    void CustomPushButtonWidget::setValue(int newValue)
    {
        if (newValue >= 7 && newValue <= 120) {
            value = newValue;
            ui->lblValue->setText(QString::number(value));
        }
    }
    
    void CustomPushButtonWidget::keyPressEvent(QKeyEvent *event)
    {
        if(enabled){
            switch (event->key()) {
            case Qt::Key_Up:
                on_btnIncrement_clicked();
                break;
            case Qt::Key_Down:
                on_btnDecrement_clicked();
                break;
            default:
                QWidget::keyPressEvent(event);
            }
        }
    }
    
    void CustomPushButtonWidget::updateEnabled()
    {
        if (enabled) {
            ui->btnIncrement->setEnabled(true);
            ui->btnDecrement->setEnabled(true);
        } else {
            ui->btnIncrement->setEnabled(false);
            ui->btnDecrement->setEnabled(false);
        }
    
    
    }
    void CustomPushButtonWidget::focusInEvent(QFocusEvent* event) {
        setStyleSheet("#customWidget {border: 1px solid red;}");
        QWidget::focusInEvent(event);
    }
    
    void CustomPushButtonWidget::focusOutEvent(QFocusEvent* event) {
        setStyleSheet("#customWidget {border: 1px solid gray;}");
        QWidget::focusOutEvent(event);
    }
    void CustomPushButtonWidget::mousePressEvent(QMouseEvent *event)
    {
    
    
        if (event->button() == Qt::LeftButton)
           {
               this->setFocus();
               buttonClicked = true;
               enabled = !enabled;
               updateEnabled(); // Update the buttons' enabled state
    
               update();
    
               event->accept(); // Indicate that the event has been handled
               return;
           }
    
           QWidget::mousePressEvent(event);
    
    
    }
    
    void CustomPushButtonWidget::paintEvent(QPaintEvent *event)
    {
    
    
        QPainter painter(this);
    
    
        QWidget::paintEvent(event);
    
    
        if (this->enabled) {
    
            painter.setPen(QPen(Qt::red, 1));
        } else {
    
            painter.setPen(QPen(Qt::gray, 1));
        }
    
    
        painter.drawRect(0, 0, width() - 1, height() - 1);
        
    }
    

    I have an issue here:
    If I mouse click on PushButton it somehow calls on_btnIncrement_clicked() or on_btnDecrement_clicked() twice and the value changes by 4. Where as with Key Press it changes by 2 , which is correct. Not sure why it is happening. Any idea?

    Christian EhrlicherC M 2 Replies Last reply
    0
    • V viniltc

      Hi,
      I've a bug somehere in the code not able to find.

      I've a widget class CustomPushButtonWidget, which has two PushButtons to increment or decrement the value by 2. I have modified the widget class to add more functionality, one of which is to detect a Key press (Up/Down key) and change the value accordingly.
      I have defined the CustomPushButtonWidget as follows:

      .h

      // custompushbuttonwidget.h
      
      #ifndef CUSTOMPUSHBUTTONWIDGET_H
      #define CUSTOMPUSHBUTTONWIDGET_H
      
      #include <QWidget>
      #include <QKeyEvent>
      #include <QMouseEvent>
      #include <QFrame>
      #include <QPainter>
      #include <QTimer>
      
      namespace Ui {
      class CustomPushButtonWidget;
      }
      
      class CustomPushButtonWidget : public QWidget
      {
          Q_OBJECT
      
      public:
          explicit CustomPushButtonWidget(QWidget *parent = nullptr);
          ~CustomPushButtonWidget();
      
          int getValue() const;
      
      signals:
          void valueChanged(int newValue);
      
      private slots:
          void on_btnIncrement_clicked();
          void on_btnDecrement_clicked();
      
      private:
          Ui::CustomPushButtonWidget *ui;
          int value;
          void setValue(int newValue);
          void keyPressEvent(QKeyEvent *event);
          void updateEnabled();
          bool enabled;  // New private member
          bool buttonClicked;
      
      
      
      protected:
          void focusInEvent(QFocusEvent* event) override;
          void focusOutEvent(QFocusEvent* event) override;
          void mousePressEvent(QMouseEvent* event) override;
          void paintEvent(QPaintEvent *event) override;
         
      
      };
      
      #endif // CUSTOMPUSHBUTTONWIDGET_H
      
      
      

      .cpp

      // custompushbuttonwidget.cpp
      
      #include "custompushbuttonwidget.h"
      #include "ui_custompushbuttonwidget.h"
      
      CustomPushButtonWidget::CustomPushButtonWidget(QWidget *parent) :
          QWidget(parent),
          ui(new Ui::CustomPushButtonWidget),
          enabled(false)
      {
          ui->setupUi(this);
          setValue(7);
      
          this->setObjectName("customWidget"); // set object name
          this->setFocusPolicy(Qt::ClickFocus);
          this->setStyleSheet("#customWidget {border: 1px solid gray;}");
      
          connect(ui->btnIncrement, &QPushButton::clicked, this, &CustomPushButtonWidget::on_btnIncrement_clicked);
          connect(ui->btnDecrement, &QPushButton::clicked, this, &CustomPushButtonWidget::on_btnDecrement_clicked);
      }
      
      CustomPushButtonWidget::~CustomPushButtonWidget()
      {
          delete ui;
      }
      
      int CustomPushButtonWidget::getValue() const
      {
          return value;
      }
      
      void CustomPushButtonWidget::on_btnIncrement_clicked()
      {
          if (value + 2 <= 120) { // only increment if result is within range
              value += 2;
              ui->lblValue->setText(QString::number(value));
              emit valueChanged(value);
          }
      }
      
      void CustomPushButtonWidget::on_btnDecrement_clicked()
      {
          if (value - 2 >= 7) { // only decrement if result is within range
              value -= 2;
              ui->lblValue->setText(QString::number(value));
              emit valueChanged(value);
          }
      }
      
      void CustomPushButtonWidget::setValue(int newValue)
      {
          if (newValue >= 7 && newValue <= 120) {
              value = newValue;
              ui->lblValue->setText(QString::number(value));
          }
      }
      
      void CustomPushButtonWidget::keyPressEvent(QKeyEvent *event)
      {
          if(enabled){
              switch (event->key()) {
              case Qt::Key_Up:
                  on_btnIncrement_clicked();
                  break;
              case Qt::Key_Down:
                  on_btnDecrement_clicked();
                  break;
              default:
                  QWidget::keyPressEvent(event);
              }
          }
      }
      
      void CustomPushButtonWidget::updateEnabled()
      {
          if (enabled) {
              ui->btnIncrement->setEnabled(true);
              ui->btnDecrement->setEnabled(true);
          } else {
              ui->btnIncrement->setEnabled(false);
              ui->btnDecrement->setEnabled(false);
          }
      
      
      }
      void CustomPushButtonWidget::focusInEvent(QFocusEvent* event) {
          setStyleSheet("#customWidget {border: 1px solid red;}");
          QWidget::focusInEvent(event);
      }
      
      void CustomPushButtonWidget::focusOutEvent(QFocusEvent* event) {
          setStyleSheet("#customWidget {border: 1px solid gray;}");
          QWidget::focusOutEvent(event);
      }
      void CustomPushButtonWidget::mousePressEvent(QMouseEvent *event)
      {
      
      
          if (event->button() == Qt::LeftButton)
             {
                 this->setFocus();
                 buttonClicked = true;
                 enabled = !enabled;
                 updateEnabled(); // Update the buttons' enabled state
      
                 update();
      
                 event->accept(); // Indicate that the event has been handled
                 return;
             }
      
             QWidget::mousePressEvent(event);
      
      
      }
      
      void CustomPushButtonWidget::paintEvent(QPaintEvent *event)
      {
      
      
          QPainter painter(this);
      
      
          QWidget::paintEvent(event);
      
      
          if (this->enabled) {
      
              painter.setPen(QPen(Qt::red, 1));
          } else {
      
              painter.setPen(QPen(Qt::gray, 1));
          }
      
      
          painter.drawRect(0, 0, width() - 1, height() - 1);
          
      }
      

      I have an issue here:
      If I mouse click on PushButton it somehow calls on_btnIncrement_clicked() or on_btnDecrement_clicked() twice and the value changes by 4. Where as with Key Press it changes by 2 , which is correct. Not sure why it is happening. Any idea?

      Christian EhrlicherC Online
      Christian EhrlicherC Online
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @viniltc said in QPushButton in a Widget:

      If I mouse click on PushButton it somehow calls on_btnIncrement_clicked() or on_btnDecrement_clicked() twice

      Because of the naming of your slots you're triggering the Qt's auto-connect feature.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      V 1 Reply Last reply
      3
      • V viniltc

        Hi,
        I've a bug somehere in the code not able to find.

        I've a widget class CustomPushButtonWidget, which has two PushButtons to increment or decrement the value by 2. I have modified the widget class to add more functionality, one of which is to detect a Key press (Up/Down key) and change the value accordingly.
        I have defined the CustomPushButtonWidget as follows:

        .h

        // custompushbuttonwidget.h
        
        #ifndef CUSTOMPUSHBUTTONWIDGET_H
        #define CUSTOMPUSHBUTTONWIDGET_H
        
        #include <QWidget>
        #include <QKeyEvent>
        #include <QMouseEvent>
        #include <QFrame>
        #include <QPainter>
        #include <QTimer>
        
        namespace Ui {
        class CustomPushButtonWidget;
        }
        
        class CustomPushButtonWidget : public QWidget
        {
            Q_OBJECT
        
        public:
            explicit CustomPushButtonWidget(QWidget *parent = nullptr);
            ~CustomPushButtonWidget();
        
            int getValue() const;
        
        signals:
            void valueChanged(int newValue);
        
        private slots:
            void on_btnIncrement_clicked();
            void on_btnDecrement_clicked();
        
        private:
            Ui::CustomPushButtonWidget *ui;
            int value;
            void setValue(int newValue);
            void keyPressEvent(QKeyEvent *event);
            void updateEnabled();
            bool enabled;  // New private member
            bool buttonClicked;
        
        
        
        protected:
            void focusInEvent(QFocusEvent* event) override;
            void focusOutEvent(QFocusEvent* event) override;
            void mousePressEvent(QMouseEvent* event) override;
            void paintEvent(QPaintEvent *event) override;
           
        
        };
        
        #endif // CUSTOMPUSHBUTTONWIDGET_H
        
        
        

        .cpp

        // custompushbuttonwidget.cpp
        
        #include "custompushbuttonwidget.h"
        #include "ui_custompushbuttonwidget.h"
        
        CustomPushButtonWidget::CustomPushButtonWidget(QWidget *parent) :
            QWidget(parent),
            ui(new Ui::CustomPushButtonWidget),
            enabled(false)
        {
            ui->setupUi(this);
            setValue(7);
        
            this->setObjectName("customWidget"); // set object name
            this->setFocusPolicy(Qt::ClickFocus);
            this->setStyleSheet("#customWidget {border: 1px solid gray;}");
        
            connect(ui->btnIncrement, &QPushButton::clicked, this, &CustomPushButtonWidget::on_btnIncrement_clicked);
            connect(ui->btnDecrement, &QPushButton::clicked, this, &CustomPushButtonWidget::on_btnDecrement_clicked);
        }
        
        CustomPushButtonWidget::~CustomPushButtonWidget()
        {
            delete ui;
        }
        
        int CustomPushButtonWidget::getValue() const
        {
            return value;
        }
        
        void CustomPushButtonWidget::on_btnIncrement_clicked()
        {
            if (value + 2 <= 120) { // only increment if result is within range
                value += 2;
                ui->lblValue->setText(QString::number(value));
                emit valueChanged(value);
            }
        }
        
        void CustomPushButtonWidget::on_btnDecrement_clicked()
        {
            if (value - 2 >= 7) { // only decrement if result is within range
                value -= 2;
                ui->lblValue->setText(QString::number(value));
                emit valueChanged(value);
            }
        }
        
        void CustomPushButtonWidget::setValue(int newValue)
        {
            if (newValue >= 7 && newValue <= 120) {
                value = newValue;
                ui->lblValue->setText(QString::number(value));
            }
        }
        
        void CustomPushButtonWidget::keyPressEvent(QKeyEvent *event)
        {
            if(enabled){
                switch (event->key()) {
                case Qt::Key_Up:
                    on_btnIncrement_clicked();
                    break;
                case Qt::Key_Down:
                    on_btnDecrement_clicked();
                    break;
                default:
                    QWidget::keyPressEvent(event);
                }
            }
        }
        
        void CustomPushButtonWidget::updateEnabled()
        {
            if (enabled) {
                ui->btnIncrement->setEnabled(true);
                ui->btnDecrement->setEnabled(true);
            } else {
                ui->btnIncrement->setEnabled(false);
                ui->btnDecrement->setEnabled(false);
            }
        
        
        }
        void CustomPushButtonWidget::focusInEvent(QFocusEvent* event) {
            setStyleSheet("#customWidget {border: 1px solid red;}");
            QWidget::focusInEvent(event);
        }
        
        void CustomPushButtonWidget::focusOutEvent(QFocusEvent* event) {
            setStyleSheet("#customWidget {border: 1px solid gray;}");
            QWidget::focusOutEvent(event);
        }
        void CustomPushButtonWidget::mousePressEvent(QMouseEvent *event)
        {
        
        
            if (event->button() == Qt::LeftButton)
               {
                   this->setFocus();
                   buttonClicked = true;
                   enabled = !enabled;
                   updateEnabled(); // Update the buttons' enabled state
        
                   update();
        
                   event->accept(); // Indicate that the event has been handled
                   return;
               }
        
               QWidget::mousePressEvent(event);
        
        
        }
        
        void CustomPushButtonWidget::paintEvent(QPaintEvent *event)
        {
        
        
            QPainter painter(this);
        
        
            QWidget::paintEvent(event);
        
        
            if (this->enabled) {
        
                painter.setPen(QPen(Qt::red, 1));
            } else {
        
                painter.setPen(QPen(Qt::gray, 1));
            }
        
        
            painter.drawRect(0, 0, width() - 1, height() - 1);
            
        }
        

        I have an issue here:
        If I mouse click on PushButton it somehow calls on_btnIncrement_clicked() or on_btnDecrement_clicked() twice and the value changes by 4. Where as with Key Press it changes by 2 , which is correct. Not sure why it is happening. Any idea?

        M Offline
        M Offline
        mpergand
        wrote on last edited by mpergand
        #3

        @viniltc said in QPushButton in a Widget:

        on_btnIncrement_clicked()

        Looks like you use automatic connection,
        but do it in code as well, maybe it's the cause ?

        [ grilled by @Christian-Ehrlicher :) ]

        1 Reply Last reply
        1
        • Christian EhrlicherC Christian Ehrlicher

          @viniltc said in QPushButton in a Widget:

          If I mouse click on PushButton it somehow calls on_btnIncrement_clicked() or on_btnDecrement_clicked() twice

          Because of the naming of your slots you're triggering the Qt's auto-connect feature.

          V Offline
          V Offline
          viniltc
          wrote on last edited by
          #4

          @Christian-Ehrlicher Thanks a lot for pointing out the bug! It seems to be working now :)

          1 Reply Last reply
          0
          • V viniltc has marked this topic as solved on

          • Login

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