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);
}
posted @ 2020-11-29 16:28  不要让自己太懒  阅读(233)  评论(0编辑  收藏  举报