📅  最后修改于: 2023-12-03 15:34:34.361000             🧑  作者: Mango
有时候,我们希望小部件能够忽略鼠标事件,即使鼠标光标在该小部件上,也不会接收鼠标消息。在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
输出的信息,说明鼠标事件被成功忽略了。