基础
- 在每个程序的main()函数的最后都会调用QApplication类的exec()函数,他会使Qt应用程序进入事件循环。
- 一旦有事件发生,Qt便会构建一个相应的QEvent子类的对象来表示,然后将他传递给相应的QObject对象或子对象。
测试 KeyPressEvent
#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QWidget>
#include <QLineEdit>
#include <QKeyEvent>
#include <QDebug>
class MyLineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit MyLineEdit(QWidget *parent = nullptr);
signals:
public slots:
protected:
void keyPressEvent(QKeyEvent *event);
};
#endif // MYLINEEDIT_H
#include "mylineedit.h"
MyLineEdit::MyLineEdit(QWidget *parent) : QLineEdit(parent)
{
}
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
qDebug() << "keyPressEvent(MyLineEdit)";
}
新建了一个 MyLineEdit
#ifndef WIDGET_H
#define WIDGET_H
#include "mylineedit.h"
#include <QWidget>
#include <QKeyEvent>
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
protected:
void keyPressEvent(QKeyEvent *event);
private:
Ui::Widget *ui;
MyLineEdit *m_lineEdit = nullptr;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_lineEdit = new MyLineEdit(this);
m_lineEdit->move(100,100);
}
Widget::~Widget()
{
delete ui;
}
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug() <<"keyPressEvent(Widget)";
}
代码的重点在于:MyLineEdit部件和Widget部件都重写了 keyPressEvent 消息处理函数,当 cursor 在MyLineEdit 的时候,按下键盘,触发了 MyLineEdit 的keyPreeEvent 消息处理函数而没有触发 Widgt 的消息处理函数!
continue:
就加了这一句,太暴力了!
然后就正常了...
如果焦点部件忽略掉(ignore)该事件,那么这个事件就会传递给这个部件的父部件
continue:
让事件继续往上(parent widget)传递,因此 Widget 才能接收到(MyLineEdit 在创建的时候就指定了 Widget 是他的父窗口)!那么此 QKeyEvent 对象就会一直被传递给父窗口,调用父窗口的 keyPressEvent 事件处理函数!
参考:
不二如是:https://fishc.com.cn/forum.php?mod=viewthread&tid=77331&ctid=447