qt中的事件机制

事件
1.QEvent -->类型 -> QKeyEvent
QEvent::KeyRelease
QEvent::MouseMove -> QMouseEvent
2.事件处理过程
三大类型事件:
1.Spontaneous events(系统产生) -->事件队列
2.Posted events (QT) ---> 事件队列
3.Sent events

先处理QT事件队列的事件,然后再处理系统消事件队列。在处理系统的事件队例,产生新的QT事件,

a.exec()//事件循环 -->发给目标
{
while( !postedEvents ) { processPostedEvents(); }
while( !qwsEvnts ){ qwsProcessEvents();?? }
while( !postedEvents ) { processPostedEvents(); }


}

读事件后 通bool QApplication::notify ( QObject * receiver, QEvent * event )

 

目标:带有一个处理函数
bool QWidget::event(QEvent * event)
{

switch (event->type())
{

case QEvent::KeyPress:{
keyPressEvent((QKeyEvent *)event);
if (!((QKeyEvent *)event)->isAccepted())
return false;
break;}

case QEvent::KeyRelease:{
keyReleaseEvent((QKeyEvent *)event);
if (!((QKeyEvent *)event)->isAccepted())
return false;
break;}
...
case
leaveEvent();
case:
}
return QWidget::event(QEvent * event);

}
void QWidget::keyPressEvent(QKeyEvent * event)
{

event->key()==Qt::Key_Delete

}
void QWidget::keyReleaseEvent(QKeyEvent * event)
{



}

3.过滤器(****重点*****)
1.目标注册一个过滤器installEventFilter()

2。修改过滤器的eventFilter()

 

改变一个事件的效果
1,重新实现事件函数。 比如: mousePressEvent(), keyPress-Event(), paintEvent() 。 这是最常规的事件处理方法。

2,重新实现QObject::event().
这一般用在Qt没有提供该事件的处理函数时。也就是,我们增加新的事件时。

3,安装事件过滤器

4,在 QApplication 上安装事件过滤器。
QApplication 上的事件过滤器将捕获应用程序的所有事件,而且第一个获得该事件。也就是说事件在发送给其它任何一个event filter之前发送给QApplication的event filter。

5,重新实现QApplication 的 notify()方法.
Qt使用 notify()来分发事件。要想在任何事件处理器捕获事件之前捕获事件,唯一的方法就是重新实现QApplication 的 notify()方法。

------------------------------------------------------------------------------------------

过滤器范例:

event.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QEvent>
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
bool eventFilter(QObject *obj, QEvent *evt);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
event.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
bool MainWindow::eventFilter(QObject *obj, QEvent *evt)
{
    if(obj==ui->pushButton)
    {
        if (evt->type() == QEvent::Enter)
            ui->label->setText("welcome");
        if(evt->type()==QEvent::Leave)
            ui->label->setText("byebye");

    }
    return 0;
}
ui.h
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.5.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QPushButton *pushButton;
    QLabel *label;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QStringLiteral("MainWindow"));
        MainWindow->resize(400, 300);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));
        pushButton = new QPushButton(centralWidget);
        pushButton->setObjectName(QStringLiteral("pushButton"));
        pushButton->setGeometry(QRect(140, 30, 99, 81));
        label = new QLabel(centralWidget);
        label->setObjectName(QStringLiteral("label"));
        label->setGeometry(QRect(140, 150, 101, 41));
        MainWindow->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QStringLiteral("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 400, 25));
        MainWindow->setMenuBar(menuBar);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(MainWindow);
        statusBar->setObjectName(QStringLiteral("statusBar"));
        MainWindow->setStatusBar(statusBar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0));
        pushButton->setText(QApplication::translate("MainWindow", "PushButton", 0));
        label->setText(QApplication::translate("MainWindow", "TextLabel", 0));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

 

posted @ 2016-04-01 11:00  高傲的monkey  阅读(893)  评论(0编辑  收藏  举报