📜  qt 使小部件忽略鼠标事件 - C++ (1)

📅  最后修改于: 2023-12-03 15:34:34.361000             🧑  作者: Mango

在Qt中使小部件忽略鼠标事件 - C++

有时候,我们希望小部件能够忽略鼠标事件,即使鼠标光标在该小部件上,也不会接收鼠标消息。在Qt中,我们可以使用QObject::installEventFilter()方法过滤鼠标事件,并使用QEvent::ignore()方法忽略事件。

以下是一个示例程序:

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>

class MouseWatcher : public QLabel
{
public:
    MouseWatcher(QWidget *parent = Q_NULLPTR) : QLabel(parent) {}

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        QLabel::mousePressEvent(event);
        qDebug() << "mousePressEvent";
    }

    bool eventFilter(QObject *obj, QEvent *event) override
    {
        if (event->type() == QEvent::MouseButtonPress) {
            event->ignore();
            return true;
        }
        return QWidget::eventFilter(obj, event);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget widget;
    widget.resize(200, 200);

    MouseWatcher *watcher = new MouseWatcher(&widget);
    watcher->setStyleSheet("background-color: yellow; font-size: 30px;");
    watcher->setText("Click me");
    watcher->setAlignment(Qt::AlignCenter);
    watcher->installEventFilter(watcher);

    widget.show();
    return app.exec();
}

在这个示例中,我们定义了一个名为MouseWatcher的小部件,该小部件继承自QLabel。在MouseWatcher中,我们重载了mousePressEvent()方法来处理鼠标按下事件,并且使用qDebug()语句打印出事件的类型。

为了让MouseWatcher能够忽略鼠标事件,我们还需要重载eventFilter()方法。在eventFilter()方法中,我们首先判断事件类型是否为QEvent::MouseButtonPress,如果是,就调用event->ignore()方法忽略该事件,并返回true。如果事件类型不是QEvent::MouseButtonPress,就交由QWidget::eventFilter(obj, event)处理。

main()函数中,我们创建了一个名为widget的窗口,并向其中添加了一个MouseWatcher小部件。我们将widget显示出来,然后调用app.exec()进入Qt程序的主循环。现在,当我们在MouseWatcher上单击鼠标时,虽然鼠标光标会变成按下状态,但是我们无法看到mousePressEvent输出的信息,说明鼠标事件被成功忽略了。