5

When a QPushButton is clicked, I want it to remain pressed down until clicked again.

void MainWindow::itemClicked(){

    QPushButton *clickedItem = qobject_cast<QPushButton *>(sender());

    qDebug() << clickedItem->isDown();

    if(!clickedItem->isDown())
        clickedItem->setDown(true);
    else
        clickedItem->setDown(false);
}

This doesn't seem to work. It will cause the button to be pressed down indefinitely.

clickedItem->isDown() is always false.

Nejat
  • 31,784
  • 12
  • 106
  • 138
Quaxton Hale
  • 2,460
  • 5
  • 40
  • 71

2 Answers2

7

isDown always returns false because you are checking it in a slot connected to the clicked signal. The clicked signal is emited when you press down the push button and release it. So every time the button is pressed and released the clicked signal is emited.

setCheckable() would work for you. It will make the button toggle. So when youu click, it'll stay in down state until you click it again.

Nejat
  • 31,784
  • 12
  • 106
  • 138
3

It should work out of the box using QAbstractButton::setCheckable(bool).

When set to true it should act the way you want it to act.

Tim Visée
  • 2,988
  • 4
  • 45
  • 55
Zaiborg
  • 2,492
  • 19
  • 28
  • Thanks, I know about `setCheckable`. I'm wondering why `isDown` doesn't work as expected. – Quaxton Hale Aug 14 '14 at 07:46
  • @МикроПингвин Probably because you do it in a slot which is connected to a `clicked` signal, and the button gets released before the slot is executed. That is why `isDown` always returns false. – thuga Aug 14 '14 at 08:02
  • How would I fix this? Would I need to implement a release slot? – Quaxton Hale Aug 14 '14 at 08:39
  • @МикроПингвин Why bother? Why not just use `QAbstractButton::setCheckable`? – thuga Aug 14 '14 at 09:12
  • as @thuga mentioned, why not use a "checkable pushbutton" and if you need the state of the button ask for it using `QAbstractButton::isChecked()` – Zaiborg Aug 14 '14 at 09:42