您的位置:首页 > 编程语言 > Qt开发

Qt之事件系统(二)

2016-12-11 11:14 435 查看

一、事件系统

概念:事件----就是事情,大点的事情叫事件,再大的事情叫事变

1.1 事件相关的类
QEvent ----比较底层的基类 一般不直接用

QInputEvent:
QKeyEvent ----常用
QMouseEvent ----常用
QTimerEvent ----常用 定时器事件

1.2 Qt中的常用事件
任何QObject子类----都可以 接收、处理 事件

如:
鼠标事件 QMouseEvent
上下文菜单事件 QContextMenuEvent
关闭事件 QClose
绘制事件 QPaintEvent

举例:
用鼠标单击 界面上的1个Button
鼠标事件 QMouseEvent ----鼠标发出的
单击信号 clicked() ----Button发出的

关键概念:
事件----信号 区别
如:鼠标发出鼠标事件;按钮发出clicked信号
但鼠标事件 又分为多种 事件类型,如单击、双击、移动 有枚举类型 QEvent::Type

注意:
我们一般只关心 信号
当需要设计 按钮时,才需要关心 事件

1.3 事件的执行顺序
知识点: keyPressEvent(QKeyEvent *event)----键盘按下事件

例子1:----父窗口、子窗口 都定义了相同的事件处理函数keyPressEvent,那么谁会被执行
编程步骤:
1、建立1个子窗口----
通过点击项目右键----Add New----C++ Class
基类填 QLineEdit

2、在子窗口、父窗口的h cpp文件中,增加keyPressEvent事件处理函数

子窗口代码:
修改h文件:
class MyLineEdit : public QLineEdit
{
public:
MyLineEdit();
MyLineEdit(QWidget *parent=0);
void keyPressEvent(QKeyEvent *event);//事件处理函数
};

修改cpp文件:
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
//qDebug()<<"keyPressEvent MyLineEdit is runed";
QLineEdit::keyPressEvent(event);
event->ignore();
return;
}

父窗口代码:
修改h文件:
#include <QtCore>
#include <QtGui>

namespace Ui
{
class Event001Widget;
}

class Event001Widget : public QWidget
{
Q_OBJECT

public:
Event001Widget(QWidget *parent = 0);
~Event001Widget();
void keyPressEvent(QKeyEvent *event);

private:
Ui::Event001Widget *ui;
};

修改cpp文件
void Event001Widget::keyPressEvent(QKeyEvent *event)
{
qDebug()<<"keyPressEvent Event001Widget is runed";
//QWidget::keyPressEvent(event);
return;
}

main.cpp文件如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Event001Widget w;
MyLineEdit *myLineEdit=new MyLineEdit(&w);
myLineEdit->move(100,100);
myLineEdit->show();
w.show();
return a.exec();
}

重要结论:
1、运行后,在子窗口内 输入字符。
2、默认情况下,只有子窗口的事件处理函数被执行
3、在子窗口内,执行 event->ignore(); 则父窗口的事件处理函数才会被执行
4、默认情况下,输入的字符 是不可见的。解决办法:在子窗口的事件处理函数中增加语句QLineEdit::keyPressEvent(event);

1.4 event事件处理函数

编程步骤:
1、在子窗口中增加event事件处理函数
修改h文件:
class MyLineEdit : public QLineEdit
{
public:
MyLineEdit();
MyLineEdit(QWidget *parent=0);
void keyPressEvent(QKeyEvent *event);//事件处理函数
bool event(QEvent *event);
};

修改cpp文件:
bool MyLineEdit::event(QEvent *event)
{
if(event->type()==QEvent::KeyPress)
{
qDebug()<<"KeyPress_event MyLineEdit is runed";
}
return QLineEdit::event(event);
}
重要结论:
1、运行后,在子窗口内 输入字符。
2、先自动调用了event处理函数,再自动调用keyPressEvent处理函数

1.5 eventFilter处理函数

编程步骤:
1、在主窗口只能够,增加eventFilter处理函数
修改h文件:
namespace Ui
{
class Event001Widget;
}

class Event001Widget : public QWidget
{
Q_OBJECT

public:
Event001Widget(QWidget *parent = 0);
~Event001Widget();
void keyPressEvent(QKeyEvent *event);
bool eventFilter(QObject *object,QEvent *event); //新增加的

private:
Ui::Event001Widget *ui;
MyLineEdit *myLineEdit; //新增的

};

定义cpp文件中的eventFilter函数:
bool Event001Widget::eventFilter(QObject *object,QEvent *event)
{
if(object==myLineEdit)
{
if(event->type()==QEvent::KeyPress)
{
qDebug()<<"eventFilter is runed";
}
}
return QWidget::eventFilter(object,event);
}

修改cpp中的构造函数
Event001Widget::Event001Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Event001Widget)
{
ui->setupUi(this);
myLineEdit=new MyLineEdit(this);
myLineEdit->move(100,100);
myLineEdit->installEventFilter(this);
}

修改main.cpp:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Event001Widget w;
w.show();
return a.exec();
}
注意:即main函数中,不用再new MyLineEdit了,因为在Event001Widget类的构造函数中,已经完成了。

运行后,发现如下规律:
1、先执行主窗口的 eventFilter事件过滤器函数
2、再执行子窗口的 event事件函数
3、再执行子窗口的 keyPressEvent事件函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt