user8579485
user8579485

Reputation: 1

No event catch during button pressed [ QT ]

I have to make a virtual keyboard.

So I created few QPushButtons, but if I click on one, and move to release on another, then the other button doesn't receive any mouse event.

I to override enterEvent(QEvent *) and leaveEvent(QEvent *), but without success when I have clicked on another button.

Anyone got an idea?

Upvotes: 0

Views: 881

Answers (1)

pat
pat

Reputation: 497

In QAbstractButton code:

void QAbstractButton::mousePressEvent(QMouseEvent *e)
{
    Q_D(QAbstractButton);
    if (e->button() != Qt::LeftButton) {
        e->ignore();
        return;
    }
    if (hitButton(e->pos())) {
        setDown(true);
        d->pressed = true;
        repaint(); //flush paint event before invoking potentially expensive operation
        QApplication::flush();
        d->emitPressed();
        e->accept();
    } else {
        e->ignore();
    }
}

When mousePressEvent triggers, QAbstractButton calls setDown(true) and QAbstractButtonPrivate ( Q_D(QAbstractButton) ) calls d->emitPressed(). After that, others buttons will not receive any events, they are already handled in the active button.

You can see in mouseReleaseEvent

void QAbstractButton::mouseReleaseEvent(QMouseEvent *e)
{
    Q_D(QAbstractButton);
    d->pressed = false;

    if (e->button() != Qt::LeftButton) {
        e->ignore();
        return;
    }

    if (!d->down) {
        // refresh is required by QMacStyle to resume the default button animation
        d->refresh();
        e->ignore();
        return;
    }

    if (hitButton(e->pos())) {
        d->repeatTimer.stop();
        d->click();
        e->accept();
    } else {
        setDown(false);
        e->ignore();
    }
}

It also checks state d->down. And if mouse hits that button, it will call d->click(); emit click event. If mouse does not hit button, it call setDown(false); to reset state.

I suggest to inherit virtual button from QWidget for easier handle mouse events.

Upvotes: 1

Related Questions