Qt44 发送自定义事件(二)

学习自唐佐林老师的Qt


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

QWidget类并没有提供鼠标双击相关的信号,所以没办法将鼠标双击信号映射到槽。此时我们又想捕捉这个鼠标双击信息,那就只能 重写 QWidget类的event()事件处理函数

实验:自定义事件类 + 处理自定义事件类对象

StringEvent.h

#ifndef _STRINGEVENT_H_
#define _STRINGEVENT_H_
#include <QEvent>
#include <QString>

//自定义事件类 ,继承自 QEvent
class StringEvent : public QEvent
{
    QString m_data;
public:
    //创建事件类全局唯一 TYPE值
    const static Type TYPE = static_cast<Type>(QEvent::User + 0xFF);
    explicit StringEvent(QString data = "");
    QString data();
    
};
#endif // _STRINGEVENT_H_

Widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QLineEdit>
class Widget : public QWidget
{
    Q_OBJECT
    
    QLineEdit m_edit;
public:
    Widget(QWidget *parent = 0);
    bool event(QEvent* evt);//重写 event()事件处理函数
    bool eventFilter(QObject* obj, QEvent* evt);//事件过滤器
    ~Widget();
};
#endif // WIDGET_H

StringEvent.cpp

#include "StringEvent.h"
StringEvent::StringEvent(QString data) : QEvent(TYPE)
{
    m_data = data;
}
QString StringEvent::data()
{
    return m_data;
}

Widget.cpp

#include "Widget.h"
#include "StringEvent.h"
#include <QMouseEvent>
#include <QDebug>
#include <QApplication>
Widget::Widget(QWidget *parent)
    : QWidget(parent), m_edit(this)//初始化列表 指定父组件
{
    //安装事件过滤器 将Widget对象作为 QLineEdit 对象的事件处理器,安装事件处理器
    m_edit.installEventFilter(this);
}
//重写 event()事件处理函数
/*
  QWidget类并没有提供鼠标双击相关的信号,所以没办法将鼠标双击信号映射到槽。此时我们又想捕捉这个鼠标双击信息,那就只能
    重写 QWidget类的event()事件处理函数
*/
bool Widget::event(QEvent* evt)
{
    //捕获鼠标双击事件
    if( evt->type() == QMouseEvent::MouseButtonDblClick )
    {
        qDebug() << "event: Before sentEvent";
        //创建自定义事件类 对象,即自定义类事件
        StringEvent e("D.T.Software");
        //给QLineEdit对象发送一个自定义类事件e,阻塞式
        QApplication::sendEvent(&m_edit, &e);
        qDebug() << "event: After sentEvent";
    }
    return QWidget::event(evt);
}
//处理自定义事件类对象,事件过滤器
bool Widget::eventFilter(QObject* obj, QEvent* evt)
{
    //判断收到事件的 事件对象 和 事件类型,并处理
    if( (obj == &m_edit) && (evt->type() == StringEvent::TYPE) )
    {
        //父类强制类型转换到子类
        StringEvent* se = dynamic_cast<StringEvent*>(evt);
        qDebug() << "Receive: " << se->data();
        m_edit.insert(se->data());//将数据插入到文本框中
        return true;//代表当前事件已经被处理,不会再传递到目标对象QLineEdit对象上面去
    }
    //如果收到事件的 事件对象 和 事件类型不是我们期望的,则直接调用父类事件过滤器
    return QWidget::eventFilter(obj, evt);
}
Widget::~Widget()
{
    
}

main.cpp

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/115704314