Qt中的事件学习

QT中的事件
事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。

事件处理...

事件传递
事件是先传递给指定窗口部件的,确切地说应该是先传递给获得焦点的窗口部件。如果该部件忽略掉该事件,那么这个事件就会传递给这个部件的父部件。重新实现事件处理函数时,一般要调用父类的相应事件处理函数来事件默认操作。
代码
mylineedit.h

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>

class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    MyLineEdit(QWidget *parent = 0);
    bool event(QEvent *event);
protected:
    void keyPressEvent(QKeyEvent *event);
};

#endif // MYLINEEDIT_H

mylineedit.cpp

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

MyLineEdit::MyLineEdit(QWidget *parent) : QLineEdit(parent)
{

}

void MyLineEdit::keyPressEvent(QKeyEvent *event) // 键盘按下事件
{
    qDebug()<<QString::fromUtf8("MyLineEdit键盘按下事件");
    QLineEdit::keyPressEvent(event);
    event->ignore(); // 忽略该事件 ignore()要在最后调用
    // 不忽略该事件执行结果:打印"MyLineEdit键盘按下事件" 忽略该事件执行结果:打印"MyLineEdit键盘按下事件"、Widget键盘事件按下
}

bool MyLineEdit::event(QEvent *event) // 事件
{
    if (event->type() == QEvent::KeyPress) {
        qDebug()<<QString::fromUtf8("MyLineEdit的event()函数");
    }
    return QLineEdit::event(event); // 执行QLineEdit类event()函数的默认操作
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class MyLineEdit;

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    bool eventFilter(QObject *obj, QEvent *event);
protected:
    void keyPressEvent(QKeyEvent *event);

private:
    Ui::Widget *ui;
    MyLineEdit *lineEdit;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    lineEdit = new MyLineEdit(this);
    lineEdit->move(100, 100);
    ui->setupUi(this);
    lineEdit->installEventFilter(this); // 在Widget上为lineEdit安装事件过滤器
}

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

void Widget::keyPressEvent(QKeyEvent *event)
{
    qDebug()<<QString::fromUtf8("Widget键盘事件按下");
}

bool Widget::eventFilter(QObject *obj, QEvent *event) // 事件过滤器
{
    if (obj == lineEdit) {
        if(event->type() == QEvent::KeyPress) {
            qDebug()<<QString::fromUtf8("Widget的事件过滤器");
        }
    }
    return QWidget::eventFilter(obj, 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();
}

 函数执行顺序:

Widget部件(父部件)eventFilter函数->MyLineEdit部件(子部件)event函数->MyLineEdit部件(子部件)KeyPressEvent()->Widget部件(父部件)keyPressEvent函数

 

posted @ 2021-10-13 15:57  朱元叹  阅读(57)  评论(0)    收藏  举报