事件的传递 键盘事件作为例子

事件的传递    键盘事件作为例子

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"mylineedit.h"
#include <QKeyEvent>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

private:
       myLineEdit * myEdit;
protected:
       void keyPressEvent(QKeyEvent * event);
public:
    bool eventFilter(QObject *watched, QEvent *event); //定义事件过滤器

};

#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mylineedit.h"
#include<QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    myEdit = new myLineEdit(this);
    myEdit->move(100,100);
    myEdit->installEventFilter(this);//给myEdit安装事件过滤器
}

Widget::~Widget()
{
    delete ui;
}

void Widget:: keyPressEvent(QKeyEvent * event)
{
    qDebug()<<tr("父窗口widget的键盘按下事件的处理函数被调用");
}

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == myEdit)
        if(event->type()==QEvent::KeyPress)
            qDebug()<<tr("父窗口widget的事件过滤器被调用");
    return QWidget::eventFilter(watched,event);
         //最后返回QWidget类默认的事件过滤器eventFilter()的执行结果
}
//myLineEdit.h
#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H

#include <QLineEdit>
class myLineEdit : public QLineEdit
{
   Q_OBJECT
public:
    explicit myLineEdit(QWidget * widget);

protected:
    void keyPressEvent(QKeyEvent * event);
public:
    bool event(QEvent *event);//重写事件函数,在事件传给事件处理函数之前,捕获事件
};

#endif // MYLINEEDIT_H
//MyLineEdit.cpp
#include "mylineedit.h"
#include <QDebug>
#include <QKeyEvent>
myLineEdit::myLineEdit(QWidget * widget):QLineEdit(widget)
{

}

void myLineEdit::keyPressEvent(QKeyEvent *event)
{
    qDebug()<<tr("输入框的键盘按下事件处理函数");
    QLineEdit::keyPressEvent(event);
    event->ignore();//忽略该事件,交给父窗口处理
}

bool myLineEdit::event(QEvent *event)
{
    if(event->type() == QEvent::KeyPress)
        qDebug()<<tr("输入框自己的event函数,在调用事件处理函数之前,捕获事件");
    return QLineEdit::event(event);
            //调用QLineEdit的默认event 函数,不然MyLineEdit界面显示会发生异常
            //该函数一般返回父类的event()函数的操作结果
}
//main.cpp
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

 事件的传递    键盘事件作为例子

 

原文链接: https://www.cnblogs.com/azbane/p/8668150.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    事件的传递    键盘事件作为例子

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/398941

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月12日 上午9:53
下一篇 2023年4月12日 上午9:53

相关推荐