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();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM