这两天在做一个软键盘,支持QLineEdit的输入,原来都是处理的keyPressEvent,现在用的是mousePressEvent,移植原来的代码居然不行。折腾了半天发现,QPushButton自身会处理到鼠标左键的单击事件,即使你用了事件过滤器也不行!具体验证了三种情况:
(1)QPushButton类会处理鼠标左键单击事件,不会再向父窗口传递,父窗口的eventFilter也无法捕捉这个事件。
(2)同在一个窗口的QLabel可以在父窗口eventFilter被捕捉
(3)继承QPushButton重新实现鼠标事件,还是不能被eventFilter捕捉,但是这样可以独立处理鼠标单击事件。
代码如下,有两种情况可以根据if、else进行选择编译:
1.dailog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QPushButton>
#if 0
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
bool eventFilter(QObject *obj, QEvent *event);
void mousePressEvent(QMouseEvent *event); //注意这里不要写成(QKeyevent *event),否则接收不到鼠标事件
void mouseReleaseEvent(QMouseEvent *event); //注意这里不要写成(QKeyevent *event),否则接收不到鼠标事件
};
#else
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
bool eventFilter(QObject