zoukankan      html  css  js  c++  java
  • qt-事件的接受和忽略

    1、事件可以被接受或忽略,被接受的事件不会再传递给其他对象,被忽略的事件会被传递给其他对象处理,或者该事件被丢弃(即没有对象处理该事件)
    2、使用 QEvent::accept()函数表示接受一个事件,使用 QEvent::ignore()函数表示忽略一个事件。也就是说若调用 accept(),则事件不会传递给父对象若调用 ignore()则事件会向父对象传递
    3、Qt 默认值是 accept (接受事件),但在 QWidget 的默认事件处理函数(比如 keyPressEvent())中,默认值是ignore(),因为这样可实现事件的传递(即子对象未处理就传递给父对象处理)。对事件的接受和忽略,最好是明确的调用 accept()和 ignore 函数
    个人理解:只有控件的基类QWidget默认值是ignore(),其子类控件默认还是accept 
    4、在 event()函数中调用 accept()或 ignore()是没有意义的,event()函数通过返回一个 bool 值来告诉调用者是否接受了事件(true 表示接受事件)。是否调用 accept()是用于事件处理函数与 event()函数之间通信的,而 event()函数返回的 bool 值是用于与 QApplication::notify()函数之间通信的
    5、注意:QCloseEvent(关闭事件)有一些不同,QCloseEvent::ignore()表示取消关闭操作,而QCloseEvent::accept()则表示让 Qt 继续关闭操作。为避免产生混淆,最好在 closeEvent()处理函数的重新实现中显示地调用 accept()和 ignore()。
     
    c.h文件
    #ifndef C_H
    #define C_H
    
    #include <QPushButton>
    #include <QDebug>
    #include<QMouseEvent>  //鼠标模块
    
    class C : public QPushButton
    {
    public:
        C();
        void mousePressEvent(QMouseEvent *e);
        void mouseReleaseEvent(QMouseEvent *e);
        void keyPressEvent(QKeyEvent* e);
        void keyReleaseEvent(QKeyEvent* e);
    
    
    
    };
    
    
    #endif // C_H

    c.cpp文件

    #include "c.h"
    
    C::C()
    {
    
    }
    
    void C::mousePressEvent(QMouseEvent *e)
    {
        qDebug()<<"C按下了鼠标:";
        e->accept();  //验证事件被接受后不会再被传递给父对象
    }
    
    void C::mouseReleaseEvent(QMouseEvent *e)
    {
        qDebug()<<"C释放了鼠标:";
        //QWidget::mouseReleaseEvent(e); //验证默认为接受事件
    
    
    }
    
    void C::keyPressEvent(QKeyEvent *e)
    {
        qDebug()<<"C按下了键盘:";
        e->ignore(); //验证事件被忽略后会被传递给父对象
    }
    
    void C::keyReleaseEvent(QKeyEvent *e)
    {
        qDebug()<<"C释放了键盘:";
                              //验证Qt的默认处理方式为接受事件(此处未明确调用accept()或ignore()函数
    }

    win.h文件

    #ifndef WIN_H
    #define WIN_H
    
    #include <QWidget>
    #include <QDebug>
    #include "c.h"
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Win; }
    QT_END_NAMESPACE
    
    class Win : public QWidget
    {
        Q_OBJECT
    
    public:
        Win(QWidget *parent = nullptr);
        ~Win();
        //重写以下事件处理函数
        void mousePressEvent(QMouseEvent *e);//鼠标按下
        void mouseReleaseEvent(QMouseEvent *e); //鼠标释放
        void keyPressEvent(QKeyEvent* e);  //键盘按下
        void keyReleaseEvent(QKeyEvent* e);//键盘释放
    
    
    private:
        Ui::Win *ui;
        C* mc;
    
    };
    
    #endif // WIN_H

    win.cpp文件

    #include "win.h"
    #include "ui_win.h"
    
    Win::Win(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Win)
    {
        ui->setupUi(this);
    
        mc=new C();
        mc->setParent(this);
        mc->setText("AAA");
        mc->move(22,22);
    
    }
    
    Win::~Win()
    {
        delete ui;
    }
    
    void Win::mousePressEvent(QMouseEvent *e)
    {
        qDebug()<<"win按下了鼠标:";
    }
    
    void Win::mouseReleaseEvent(QMouseEvent *e)
    {
        qDebug()<<"win释放了鼠标:";
    }
    
    void Win::keyPressEvent(QKeyEvent *e)
    {
        qDebug()<<"win按下了键盘:";
    }
    
    void Win::keyReleaseEvent(QKeyEvent *e)
    {
        qDebug()<<"win释放了键盘:";
    }

    main.cpp文件

    #include "win.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        Win w;
        w.show();
        return a.exec();
    }

    以上工程下载地址:链接:https://pan.baidu.com/s/1PpDWWKwIGvdbSD_qVaxGPA      提取码:6666    

  • 相关阅读:
    day55---前端基础之BOM操作和DOM操作
    每日作业5/8
    数据库之索引
    数据库之视图、触发器、事务、存储过程、内置函数、流程控制
    每日作业5/7
    数据备份与pymysql模块
    Navicat与MySQL使用
    每日作业5/6
    数据库之多表查询
    数据库之单表查询
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13708108.html
Copyright © 2011-2022 走看看