A.图形界面应用程序的消息处理模型
B.Qt平台将系统产生的消息转换为Qt事件
1.Qt事件是一个QEvent的对象
2.Qt事件用于描述程序内部或外部发生的动作
3.任意的QObject对象都具备事件处理的能力
C.GUI应用程序的事件处理方式
1.Qt事件产生后立即被分到QWidget对象
2.QWidget中的event(QEvent)进行事件处理
3.event()根据事件类型调用不同的事件处理函数
4.在事件处理函数中发送Qt预定义的信号
5.调用信号关联的槽函数
场景分析
QPushButton事件处理分析
1.接收到鼠标事件
2.调用event(QEvent)成员函数
3.调用mouseReleaseEvent(QMouseEvent*)成员函数
4.调用click()成员函数
5.触发SIGNAL(clicked())
代码示例--自定义事件
QMyPushButton.cpp
#include "QMyPushButton.h"
#include
QMyPushButton::QMyPushButton(QWidget* parent, QButtonListener* listener) : QPushButton(parent)
{
m_listener = listener;
}
void QMyPushButton::mouseReleaseEvent(QMouseEvent *e)
{
if( m_listener != NULL )
{
m_listener(this, e);
e->accept();
setDown(false);
}
else
{
QPushButton::mouseReleaseEvent(e);
}
}
QMyPushButton.h
#ifndef QMYPUSHBUTTON_H
#define QMYPUSHBUTTON_H
#include
typedef void (QButtonListener)(QObject*, QMouseEvent*);
class QMyPushButton : public QPushButton
{
Q_OBJECT
protected:
QButtonListener* m_listener;
void mouseReleaseEvent(QMouseEvent *e);
public:
explicit QMyPushButton(QWidget* parent = 0, QButtonListener* listener = 0);
signals:
public slots:
};
#endif // QMYPUSHBUTTON_H
Widget.cpp
#ifndef QMYPUSHBUTTON_H
#define QMYPUSHBUTTON_H
#include
typedef void (QButtonListener)(QObject*, QMouseEvent*);
class QMyPushButton : public QPushButton
{
Q_OBJECT
protected:
QButtonListener* m_listener;
void mouseReleaseEvent(QMouseEvent *e);
public:
explicit QMyPushButton(QWidget* parent = 0, QButtonListener* listener = 0);
signals:
public slots:
};
#endif // QMYPUSHBUTTON_H
Widget.h
#ifndef QMYPUSHBUTTON_H
#define QMYPUSHBUTTON_H
#include
typedef void (QButtonListener)(QObject*, QMouseEvent*);
class QMyPushButton : public QPushButton
{
Q_OBJECT
protected:
QButtonListener* m_listener;
void mouseReleaseEvent(QMouseEvent *e);
public:
explicit QMyPushButton(QWidget* parent = 0, QButtonListener* listener = 0);
signals:
public slots:
};
#endif // QMYPUSHBUTTON_H
运行的结果以及按钮释放时的打印结果如图所示
D.事件和信号不同
1.事件由具体对象进行处理
2.信号由具体对象主动产生
3.改写事件处理函数可能导致程序行为发生改变
4.信号是否存在对应的槽函数不会改变程序行为
5.一般而言,信号在具体的事件处理函数中产生
E.事件的传递过程
QEvent中的关键成员函数
1.void ignore()--接收者忽略当前事件,事件可能传递给父组件
2.void accept()--接收者期望处理当前事件
3.bool isAccepted()--判断当前事件是否被处理
代码生成的结果运行如图所示
F.Qt中的事件过滤
1.事件过滤器可以对其他组件接收到的事件进行监控
2.任意的QObject对象都可以作为事件过滤器使用
3.事件过滤器对象需要重写eventFilter()函数
组件通过installEventFilter()函数安装事件过滤器
1.事件过滤器在组件之前接收到事件
2.事件过滤器能够决定是否将事件转发到组件对象
基本的代码实现
小结
1.Qt事件和信号不同
2.事件由QObject的对象进行处理
3.信号由QObject对象触发
4.重写事件处理函数可能该变程序行为
5.信号的触发不会对程序行为造成影响
6.事件处理实在实际工程开发中的应用非常普遍
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。