Reputation: 1
I have to make a virtual keyboard.
So I created few QPushButton
s, 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
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