zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Java+7入门经典 -1 简介
    优化算法动画演示Alec Radford's animations for optimization algorithms
    如何写科技论文How to write a technical paper
    开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs
    用500行Julia代码开始深度学习之旅 Beginning deep learning with 500 lines of Julia
    用10张图来看机器学习Machine learning in 10 pictures
    ICLR 2013 International Conference on Learning Representations深度学习论文papers
    ICLR 2014 International Conference on Learning Representations深度学习论文papers
    卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
    卷积神经网络Convolutional Neural Networks
  • 原文地址:https://www.cnblogs.com/defen/p/5344189.html
Copyright © 2011-2022 走看看