zoukankan      html  css  js  c++  java
  • qt5-event事件的传递

    enent事件是通过返回true或false,来决定是否传递事件,不能通过接受accept()或忽略ignore()

    c.h文件

    #ifndef C_H
    #define C_H
    
    #include <QPushButton>
    #include <QEvent>
    #include <QDebug>
    
    class C:public QPushButton
    {
    public:
        C();
        bool event(QEvent* e); //重写event事件
    
    };
    
    #endif // C_H

    c.cpp文件

    #include "c.h"
    
    C::C()
    {
    
    }
    
    bool C::event(QEvent *e)
    {
        if(e->type()==QEvent::KeyPress)
         {qDebug()<<"C按下了键盘";
         return 0;   //返回false,将事件传递给父对象处理
        }
         if(e->type()==QEvent::MouseButtonPress)
         {qDebug()<<"C按下了鼠标";
         return 1; } //返回true,事件不传递给父对象
         return QWidget::event(e);
    }

    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();
        bool event(QEvent* 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);
        resize(300,200);
    
    }
    
    Win::~Win()
    {
        delete ui;
    
    }
    
    bool Win::event(QEvent *e)
    {
        if(e->type()==QEvent::KeyPress)
         {qDebug()<<"win你按下了键盘"; }
         if(e->type()==QEvent::MouseButtonPress)
         {qDebug()<<"win你按下了鼠标"; }
         if(e->type()==QEvent::MouseButtonRelease)
         {qDebug()<<"你释放了鼠标"; }
        return QWidget::event(e);
    }

    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/17ULgzD3I8SfkrLC-eNbAEg    提取码:6666   

    事件的传递顺序

    event()函数、事件过滤器、和事件处理函数的调用顺序如下:
    首先按逆序调用事件过滤器,然后调用 event()函数,最后调用事件处理函数(注意:事件处理函数需在 event()函数中明确或间接调用,否则不会调用事件处理函数)。

  • 相关阅读:
    由优化反射性能问题引发的思考
    Flash还能走多远?
    .net CLR 4.0垃圾回收机制的改进之3
    Silverlight 3引入了GPU加速的特性
    java 字符串
    JAVA 容器
    JAVA 反转链表
    JAVA 自定义比较器
    JAVA 类相关知识
    vscode 输出中文乱码
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13710250.html
Copyright © 2011-2022 走看看