• Qt_事件


    一、事件介绍

      事件(event)是由窗口系统或者Qt自身产生的,用以响应所发生的各类事情。当用户按下或者松开键盘或者鼠标上的按键时,就可以产生一个键盘或者鼠标事件;当某个窗口第一次显示的时候,就会产生一个绘制事件,用来告知窗口需要重新绘制它本身,从而使得该窗口可见。大多数事件是作为用户动作响应而产生的,但是也有些例外,比如像定时器事件,则是由系统独立产生的。

      在使用Qt进行编程开发时,基本不需要考虑事件,因为在发生某些重要的事情时,Qt窗口部件都会发射信号。但是当我们需要编写自己的自定义窗口部件,或者是当我们希望改变已经存在的Qt窗口部件行为时,事件就变得非常有用了。

    二、QEvent

      Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)

      通常我们使用的系统事件都是[virtual protected]类型的,在使用的过程中需要重新声明和定义,下面我们直接通过举例来介绍如何重写自定义事件。

      在.h文件中:

    /* 包含两个事件头文件 */
    #include <QKeyEvent>
    #include <QMouseEvent>
    
    class MyMainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MyMainWindow(QWidget *parent = nullptr);
        ~MyMainWindow();
    
    private:
        Ui::MyMainWindow *ui;
        
    protected:
        /* 声明按键按下事件 */
        void keyPressEvent(QKeyEvent *event);
        /* 声明按键释放事件 */
        void keyReleaseEvent(QKeyEvent *event);
        /* 声明鼠标移动事件事件 */
        void mouseMoveEvent(QMouseEvent *event);
        /* 声明鼠标按下事件事件 */
        void mousePressEvent(QMouseEvent *event);
        /* 声明鼠标释放事件事件 */
        void mouseReleaseEvent(QMouseEvent *event);
    };

       在.cpp文件中:

    /* 重新定义按键按下事件 */
    void MyMainWindow::keyPressEvent(QKeyEvent *event)
    {
        switch(event->key())
        {
        case Qt::Key_0:
            if(event->modifiers() & Qt::ControlModifier)
            {
                /* 组合键 */
                ui->label->setText(QString("<center><h1> Ctrl+0 </h1></center>"));
            }
            else
            {
                ui->label->setText(QString("<center><h1> 0 </h1></center>"));
            }
            break;
        case Qt::Key_A:
            if(event->modifiers() & Qt::ShiftModifier)
            {
                ui->label->setText(QString("<center><h1><font color = red> A </font></h1>    
                                            </center>"));
            }
            else
            {
               ui->label->setText(QString("<center><h1><font color = red> a </font></h1> 
                                           </center>"));
            }
            break;
        }
    }
    
    /* 重新定义按键释放事件 */
    void MyMainWindow::keyReleaseEvent(QKeyEvent *event)
    {
        
    }
    
    /* 重新定义鼠标移动事件 */
    void MyMainWindow::mouseMoveEvent(QMouseEvent *event)
    {
        ui->label->setText(QString("<center><h1>Move:(%1, %2)</h1></center>")
                           .arg(event->x()).arg(event->y()));
    }
    
    /* 重新定义鼠标按下事件 */
    void MyMainWindow::mousePressEvent(QMouseEvent *event)
    {
        ui->label->show();
        ui->label->setText(QString("<center><h1>Point:(%1, %2)</h1></center>")
                           .arg(event->x()).arg(event->y()));
    }
    
    /* 重新定义鼠标释放事件 */
    void MyMainWindow::mouseReleaseEvent(QMouseEvent *event)
    {
        ui->label->hide();
    }

      以上对按键事件和鼠标事件的使用举了一个例子,下面我们再介绍一下绘图事件void paintEvent(QPaintEvent *);

      在.h文件中: 

    /* 包含画家头文件 */
    #include <QPainter>
    
    class MyMainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MyMainWindow(QWidget *parent = nullptr);
        ~MyMainWindow();
    
    private:
        Ui::MyMainWindow *ui;
        
    protected:
        /* 重新声明一下绘图事件函数 */
        void paintEvent(QPaintEvent *);
    };

      在.cpp文件中: 

    /* 重新定义绘图事件 */
    void MyMainWindow::paintEvent(QPaintEvent *)
    {
        /* 创建一个画家,并指定父对象 */
        QPainter myPainter(this);
        /* 设置画家的画笔颜色和线条宽度 */
        myPainter.setPen(QPen(QColor(192,192,192), 2));
        /* 在指定两点画线 */
        myPainter.drawLine(160,100,780,100);
    }
  • 相关阅读:
    移动端如何强制页面横屏
    css实现内容渐变隐藏效果,手机网页版知乎内容隐藏效果的实现
    css3中样式计算属性calc()的使用和总结
    如何使用JS操纵伪元素
    HTML5全局属性汇总
    20 个 CSS高级样式技巧汇总
    网页开发中利用CSS以图换字的多中实现方法总汇
    html/css解决inline-block内联元素间隙的多种方法总汇
    [算法] 泊松分布、指数分布
    [算法] 递归
  • 原文地址:https://www.cnblogs.com/wenhao-Web/p/14056712.html
Copyright © 2020-2023  润新知