4、重写event函数

如果每个对象的事件处理函数有多个,可以一个个重写,也可以重写事件分发函数()。

案例:

4.1、新建工程

4.2、重写该窗口的鼠标按下及抬起事件

方式1:

.h中声明

登录后复制
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
  • 1.
  • 2.

.cpp中实现

登录后复制
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"窗口内有鼠标按下";
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
      qDebug()<<"窗口内有鼠标抬起";
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

方式2:

.h中声明

登录后复制
virtual bool event(QEvent *event);
.cpp中实现
bool MainWindow::event(QEvent *event)
{
    if(event->type()== QEvent::MouseButtonPress){
        qDebug()<<"窗口内有鼠标按下";
        return true;//该事件已处理
    }
    if(event->type()== QEvent::MouseButtonRelease){
         qDebug()<<"窗口内有鼠标抬起";
        return true;//该事件已处理
    }
  //  return false;//其他事件全部不处理
    return QMainWindow::event(event);//其他的事件交给QMainWindow父对象继续处理
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

重写event函数_第1张图片

5、重写eventFilter函数

三个步骤:

1、安装过滤器

登录后复制
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->installEventFilter(this);
}
2、在.h声明要重写的过滤器函数
  virtual bool eventFilter ( QObject * watched, QEvent * event );
3、在cpp中实现
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==this){
        //只对当前窗口处理
            if(event->type()== QEvent::MouseButtonPress){
                qDebug()<<"窗口内有鼠标按下";
                return true;//该事件已处理
            }
            if(event->type()== QEvent::MouseButtonRelease){
                 qDebug()<<"窗口内有鼠标抬起";
                return true;//该事件已处理
            }
            return false;//当前窗口只处理两个事件


    }
    return QMainWindow::eventFilter(watched, event);


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

总结:

1、重写事件方式目前3种:

1.1重写某个控件的具体事件。(QWidget---->event)

1.2重写某个控件的事件分发event函数(一个函数中可以实现重写多个事件,但是一定记得不感兴趣的事件要交给父对象继续处理)

1.3重写对象派发过滤器函数(一个函数中可以给多个对象实现重写多个事件,但是一定记得不感兴趣的对象和事件要交给父对象继续处理)

2、建议重写事件采用第一种。(虽然麻烦,但是不容易出错)。