• 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
  • 相关阅读:

    删与改

    基本操作
    名词解释
    Python内置函数(11)——complex
    Python内置函数(10)——float
    Python内置函数(9)——int
    Python内置函数(8)——bool
    Python内置函数(7)——sum
  • 原文地址:https://www.cnblogs.com/defen/p/5344189.html
Copyright © 2020-2023  润新知