zoukankan      html  css  js  c++  java
  • qt-事件处理的方式

    cpp文件

    #include "win.h"
    #include "ui_win.h"
    
    Win::Win(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Win)
    {
        ui->setupUi(this);
    }
    
    Win::~Win()
    {
        delete ui;
    }
    
    bool Win::event(QEvent *e)
    {
        static int i=0; //i 用于计数
        qDebug()<<"E捕获到事件:"<<i++; //验证该函数能在事件到达目标对象之前被捕获
        if(e->type()==QEvent::KeyPress){  //处理指定事件
            qDebug()<<"你按下了键盘";
        }
        return QWidget::event(e); //把其它事件返回给基类
        /*此处应调用父类的 event 函数以对未处理的事件进行处理,若此处不
        调用父类的 event,则本例 mousePressEvent 处理函数中的内容将不会
        被执行。读者可使此处返回 1 或者 0 进行验证。*/
    
    }
    
    void Win::mousePressEvent(QMouseEvent *e)
    {
        qDebug()<<"你按下了鼠标";
    }

    h文件

    #ifndef WIN_H
    #define WIN_H
    
    #include <QWidget>
    #include <QDebug>
    
    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); //事件处理方式1:重写虚函数QObject::event()
        //事件是由顶层基类QObject的event函数来捕获的
    
        void mousePressEvent(QMouseEvent* e);  //事件处理方式2:重写基类中的虚函数
        //这是Qt中最简单的事件处理方式
    
    private:
        Ui::Win *ui;
    };
    
    
    #endif // WIN_H

    main文件

    #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/1LlVo3zICQo8xz75GchmV8A     提取码:6666   

    事件处理方式3:重写notify(事件分发)函数

    AA.h文件

    #ifndef AA_H
    #define AA_H
    
    #include <QApplication>
    #include <QDebug>
    
    class AA : public QApplication
    {
    public:
        AA(int i,char *p[]):QApplication(i,p){};
        /*Qt处理事件的方式之3:”继承 QApplication 并重新实现 notify()函数”。
         Qt 调用 QApplication 来发送一个事件,重新实现 notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法。
        事件过滤器使用更为便利。因为可以同时有多个事件过滤器。而 notify()函数只有一个*/
        bool notify(QObject *o,QEvent *e); //重写虚函数 notify
    
    
    
    };
    
    #endif // AA_H

    AA.cpp文件

    #include "aa.h"
    
    bool AA::notify(QObject *o, QEvent *e)
    {
        static int i=0;
        qDebug()<<"AA-N"<<i++;
        if(o->objectName()=="ma"&&e->type()==QEvent::MouseMove){
            qDebug()<<"你移动了鼠标";
    
        }
        return QApplication::notify(o,e);
    }

    win.h

    #ifndef WIN_H
    #define WIN_H
    
    #include <QWidget>
    #include <QDebug>
    
    class Win : public QWidget
    {
        Q_OBJECT
    
    public:
        Win(QWidget *parent = nullptr);
        ~Win();
    
        bool event(QEvent* e); //重写虚函数 QObject::event()
    
    };
    #endif // WIN_H

    win.cpp

    #include "win.h"
    
    Win::Win(QWidget *parent)
        : QWidget(parent)
    {
    }
    
    Win::~Win()
    {
    }
    
    bool Win::event(QEvent *e)
    {
        qDebug()<<"winE事件";  //用于验证该函数是否被执行
        return QWidget::event(e);
    }

    main.cpp

    #include "win.h"
    #include "aa.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        AA a(argc, argv);
        Win ma;
        ma.setObjectName("ma");
        ma.resize(300,200);
        ma.show();
        return a.exec();
    }

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

     

  • 相关阅读:
    嫁给程序员1314的好处
    TCP/IP、Http、Socket、XMPP-从入门到深入
    Redis集群案例与场景分析
    Java程序片段
    Spring Security(08)——intercept-url配置
    python virtualenv virtualenvwrapper
    django 删除表后如何恢复
    mysql行转列,单列转多行
    mysql开发之join语句学习
    django前后端数据传输学习记录
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13703881.html
Copyright © 2011-2022 走看看