事件的接收与忽略的示意图如下图:
依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制。在一个特殊的情形下,我们必须使用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(); } }
转载于:https://www.cnblogs.com/doker/p/11063742.html