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

No event catch during button pressed [ QT ]

本文关键字:QT 事件 按钮      更新时间:2023-10-16

我必须制作虚拟键盘。

因此,我创建了几个QPushButton s,但是如果我单击一个,然后移动在另一个上释放,则另一个按钮不会收到任何鼠标事件。

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

有人有一个主意吗?

在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(); emit单击事件。如果鼠标未点击按钮,它将setDown(false);调用以重置状态。

我建议从Qwidget继承虚拟按钮,以更轻松地处理鼠标事件。