我必须制作一个虚拟键盘。
所以我创建了几个QPushButton
,但是如果我点击一个,然后移动到另一个,那么另一个按钮不会收到任何鼠标事件。
我要覆盖enterEvent(QEvent *)
和leaveEvent(QEvent *)
,但是当我点击另一个按钮时没有成功。
有人有个主意吗?
答案 0 :(得分:1)
在QAbstractButton代码中:
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();
}
}
当mousePressEvent触发时,QAbstractButton调用setDown(true)
和QAbstractButtonPrivate(Q_D(QAbstractButton)
)调用d->emitPressed()
。之后,其他按钮将不会收到任何事件,它们已在活动按钮中处理。
您可以在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();
}
}
它还会检查状态d->down
。如果鼠标点击该按钮,它将调用d->click();
发出点击事件。如果鼠标没有按下按钮,则会调用setDown(false);
来重置状态。
我建议从QWidget继承虚拟按钮,以便更轻松地处理鼠标事件。