Qt+事件的接收和忽略

事件的接收与忽略的示意图如下图:

                

  依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制。在一个特殊的情形下,我们必须使用accept()和ignore()函数,那就是窗口关闭的事件对于窗口关闭Qcloseevent事件,调用accept()意味着Qt会停止事件的传播,窗口关闭,调用ignore()则意味着事件继续传播,即阻止窗口关闭。

工程文件图,如下图:

          

ui界面图:

 

mybutton.h:

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>

class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = 0);

protected:
    //重定义鼠标点击事件
    void mousePressEvent(QMouseEvent *e);


signals:

public slots:
};

#endif // MYBUTTON_H

 

mywidget.h:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QMouseEvent>
namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = 0);
    ~MyWidget();

protected:

    //重写鼠标点击事件
    void mousePressEvent(QMouseEvent *);

    //关闭事件
    void closeEvent(QCloseEvent *event);

private:
    Ui::MyWidget *ui;
};

#endif // MYWIDGET_H

 

mybutton.cpp:

#include "mybutton.h"

#include <QMouseEvent>
#include <QDebug>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{

}
void MyButton::mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton)
    {
        //这里假设为信号的接收
        //如果是左键按下
        qDebug()<<"按下的是左键";
        //事件接收后,就不会往下传递
        e->ignore();//忽略,事件继续往下传递,那么给谁传递呢?
                    //事件传递给了父组件,不是给父类(基类)即MyButton,在这里就是传递给了 MyWidget ,为了验证到底是不是给了它,
                    //这里在MyWidget类中重写鼠标点击事件,如果MyWidget类中的鼠标点击事件发生,那么就是。
                    //经过验证程序执行了qDebug()<<"+++++++++++++++0";那么就是传递给了 MyWidget,
                    // 不是给父类(基类)即MyButton类中的事件 qDebug()<<"按钮被按下";
                    //值得一提的是,ignore()一般不是在这种事件中使用的,而是在closeEvent这种事件中使用的最多。即关闭窗口的时候使用
                    //可以对MyWidget类中的closeEvent事件进行重写,让其出现提示窗口。
    }
    else
    {
            //事件需要继续的往下传递
            //这里假设为信号的忽略
            //不做处理
         QPushButton::mousePressEvent(e);
            //事件的忽略,事件继续往下传递
    }
}

 

mywidget.cpp:

#include "mywidget.h"
#include "ui_mywidget.h"

#include <QDebug>
#include<QMessageBox>
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&MyButton::clicked,[=](){
        qDebug()<<"按钮被按下";
    });
}

MyWidget::~MyWidget()
{
    delete ui;
}


void MyWidget::mousePressEvent(QMouseEvent *e)
{
    qDebug()<<"+++++++++++++++0";
}


//MyWidget类中的closeEvent事件进行重写,让其出现是否关闭的提示窗口。
void MyWidget::closeEvent(QCloseEvent *event)
{
    int ret = QMessageBox::question(this,"QQQQQ","是否关闭");

    if (ret == QMessageBox::Yes)
    {
        //关闭窗口
        //处理关闭窗口事件,接收事件,事件就不会再往下传递
        event->accept();
    }
    else
    {
        //不关闭窗口
        //忽略事件,事件继续给父组件传递
        event->ignore();
    }
}

 

posted @ 2019-06-21 11:48  Mr_Song_D  阅读(2578)  评论(0编辑  收藏  举报