QPushButton in a Widget
-
Hi,
I've a bug somehere in the code not able to find.I've a widget class
CustomPushButtonWidget
, which has twoPushButtons
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 theCustomPushButtonWidget
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 onPushButton
it somehow callson_btnIncrement_clicked()
oron_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? -
@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.
-
@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 :) ]
-
@Christian-Ehrlicher Thanks a lot for pointing out the bug! It seems to be working now :)
-