按下按钮时没有事件捕获[QT]

时间:2017-09-08 14:02:21

标签: c++ qt

我必须制作一个虚拟键盘。

所以我创建了几个QPushButton,但是如果我点击一个,然后移动到另一个,那么另一个按钮不会收到任何鼠标事件。

我要覆盖enterEvent(QEvent *)leaveEvent(QEvent *),但是当我点击另一个按钮时没有成功。

有人有个主意吗?

1 个答案:

答案 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继承虚拟按钮,以便更轻松地处理鼠标事件。