事件的接收與忽略的示意圖如下圖:
依據前面的知識,事件是可以依據情況進行接收和忽略的,事件的傳播是組件層次上面的,而不是依靠類繼承機制。在一個特殊的情形下,我們必須使用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(); } }