目录
前言
根据视频看的事件处理,但是没有顺序,所以有点乱!不过理解起来也不麻烦!学习!分享!感谢!
Qt的事件分发过程
在QApplication::exec()的事件循环中,会不断判断事件的产生,然后把产生的事件分派给对应的控件。比如,在QPushButton中产生了keyPressEvent()事件,这时候QApplication::exec()会把事件分派给QPushButton::event(),而如果QPushButton::event()忽略了keyPressEvent(),QMainWindow::event()可以选择是否对这个事件进行处理。
所以,如果我们想自己处理事件,我们可以重写QPushButton::event()事件,也可以重写QPushButton::keyPressEvent()
从上图可以知道,我们的事件先会到达event()函数,在这个函数中判断发生的事件是什么,然后转到对应的事件进行处理。
重新实现event()
重新实现event()可以在事件到达特定的事件处理器之前进行处理,使用情形如下:
覆盖Tab键的默认功能
就是如果一个事件对于整个控件都有效,我们可以使用重写event()没有特定事件处理器的不常用事件
如果一个事件,比如没有QPushButton::keyPressEvent()这样的特定事件处理器,我们可以在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.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
- widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mytextedit.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// ui have widget object, widget object is parent object of myTextEdit
MyTextEdit *myTextEdit = new MyTextEdit(ui->widget);
myTextEdit->setGeometry(0, 0, 260, 100);
}
Widget::~Widget()
{
delete ui;
}
- mytextedit.h
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H
#include <QTextEdit>
class MyTextEdit : public QTextEdit
{
public:
MyTextEdit(QWidget *parent=0);
protected:
bool event(QEvent* e);
};
#endif // MYTEXTEDIT_H
- mytextedit.cpp
#include "mytextedit.h"
#include <QKeyEvent>
#include <QEvent>
#include <QtWidgets>
MyTextEdit::MyTextEdit(QWidget *parent) : QTextEdit(parent)
{
// QEvent e;
}
bool MyTextEdit::event(QEvent *e)
{
if(e->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = (QKeyEvent*)e;
if(keyEvent->key() == Qt::Key_Tab)
{
// Tab's function changed
QMessageBox::information(this, tr("Test"), tr("MyTextEdit"));
return false;
// not refer to keyPressEvent(), we have deal with keyEvent
}
}
return QTextEdit::event(e);
}
- widget.ui
代码解析:
解析注意一:
我们知道在进行事件处理的时候,QApplication::exec()函数会判断发生对应事件的是哪个控件,然后通过这个控件的event()函数分发这个事件到下一级的event()。比如QEvent::keyPress事件,这个事件会从event()事件传递到keyEvent()中进行处理。
我们可以在传递的特定的事件处理器之前重写event()函数来对这个事件进行处理,也可以选择重写特定的事件处理器来进行处理。这里使用的就是重写event()函数。当然只是重写对应的某个事件的处理函数。为了保证其他事件不被影响,我们需要在重写的函数中加入QTextEdit::event(e);。
这里我们重写了QLineEdit的Key_Tab事件,这样的结构就是这个事件在event()中进行处理了,而不会向下传递,如果需要传递ignore()应该可行。解析注意二:
我们使用的Qt设计师来对控件进行布局,这时候我们由通过源代码的方式继承了QLineEdit,如何把这个继承的控件加入到ui界面中?可以在ui中添加一个widget控件作为mytextedit控件的父对象,这样就可以把控件加入的ui界面中。当然我们也可以对控件使用提升法。参见: Qt小程序(四)-添加窗口部件到Qt Designer。代码结果
在继承的mytextedit中按Tab键会产生退出效果,同时会产生QMessageBox。
总结
Qt中的事件处理方法和位置有很多,具体使用很灵活!了解的基础知识,剩下的才是真正的代码设计!所以,经济基础决定上层建筑!周六愉快!

本文介绍了Qt事件分发过程,强调了重写event()函数的作用,如覆盖默认行为、处理不常用事件和自定义事件。通过代码示例展示了如何在main.cpp、widget.h、widget.cpp等文件中实现,并解释了如何将自定义控件集成到Qt Designer的UI中。文章最后总结了Qt事件处理的灵活性,并鼓励进一步学习。
539

被折叠的 条评论
为什么被折叠?



