【QT】QT中的事件

QT中的事件

1.事件的定义和作用

通俗的话:用户对于QT程序所做的任何行为动作,都叫做事件

比如:

用户用鼠标点击了窗口 --》鼠标点击事件 用户按下了键盘上的某个按键 --》按键事件

用户用鼠标把窗口拉大,拉小 --》窗口大小改变事件

用户用鼠标把窗口拖动 --》移动事件
\quad QT中往往用事件来做一些复杂的功能

比如:窗口放大的时候 --》窗口背景色不断的变红

获取物理键盘输入的字符

判断点击的是鼠标的左键还是鼠标的右键,中间键

cpp 复制代码
QEvent类:QT中所有事件类的父类
QMouseEvent --》鼠标事件
    常用方法:
          button()   //返回鼠标点击的按键
          x()        //返回x坐标
          y()        //返回y坐标
QKeyEvent   --》按键事件
    常用方法:
         int QKeyEvent::key() const
               返回值:按键的键值(不是ASCII码值)
         QString QKeyEvent::text() const
               返回值:按键的字面值
QResizeEvent --》大小改变事件
QMoveEvent --》移动事件

2.QT中事件产生和派发流程

2.1 步骤

cpp 复制代码
第一步:事件的产生
     用户做了某个动作,就会自动产生对应的事件
     不同的行为动作,会产生不同类型的事件
第二步:事件的派发--》把这个事件发送出去(QT系统自动完成的)
     [static] void QCoreApplication::postEvent(QObject *receiver, QEvent *event)
                  参数:receiver --》事件的接收者(事件作用于谁,谁就是接收者)
                        event --》打算发送什么事件   
第三步:事件的响应(接收)
    [virtual] bool QObject::event(QEvent *e)   //专门接收所有的事件,所以的事件都必须经过该函数来接收
                  参数:e --》保存目前产生的事件
    Type QEvent::type() const     //返回QT支持的所有的事件类型
                  返回值:QEvent::Close  --》窗口关闭
                          QEvent::KeyPress --》按键
                          QEvent::Move --》移动
                          QEvent::Resize --》大小改变   
第四步:事件的处理(响应)函数
    Qt针对不同的事件类型,定义了大量的事件处理(响应)函数
    比如:对于鼠标事件,处理函数有如下这些
             mouseMoveEvent(QMouseEvent *event)
             mousePressEvent(QMouseEvent *event)
             mouseReleaseEvent(QMouseEvent *event)
         按键事件
             void QWidget::keyPressEvent(QKeyEvent *event)    //按下按键
             void QWidget::keyReleaseEvent(QKeyEvent *event)  //松开按键
         移动事件
             void QWidget::moveEvent(QMoveEvent *event)
         大小改变事件
             void QWidget::resizeEvent(QResizeEvent *event)
         关闭事件
             void QWidget::closeEvent(QCloseEvent *event)
         命名规律: 动词Event(事件类型指针)

2.2 图示

示例代码:(event函数接收所有事件)

cpp 复制代码
// widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QEvent>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    /*
        证明:事件流程的第三步,所有的事件都会被event函数接收
        多态的知识:子类重写父类的同名虚函数,到时候调用的就是子类自己的
    */
    bool event(QEvent *event);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H


// widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

bool Widget::event(QEvent *event)
{
    //判断产生了哪些事件(判断其中一部分)
    if (event->type() == QEvent::Close) {
        qDebug()<<"窗口关闭";
    }
    if (event->type() == QEvent::KeyPress) {
        qDebug()<<"键盘按下";
    }
    if (event->type() == QEvent::Move) {
        qDebug()<<"窗口移动";
    }
}

3.常见的事件

3.1 鼠标事件

示例代码:

cpp 复制代码
// widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    /*
        证明事件流程的第四步:event收到事件之后,会调用事件响应函数
        重写一部分事件响应函数
    */
    void mousePressEvent(QMouseEvent *e);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H


// widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//鼠标事件对应的事件响应函数
void Widget::mousePressEvent(QMouseEvent *e)
{
    // 获取左键,右键,中间键
    if (e->button() == Qt::LeftButton)
    {
        qDebug()<<"此时按下的是鼠标左键";
    }
    if (e->button() == Qt::RightButton)
    {
        qDebug()<<"此时按下的是鼠标右键";
    }
    if (e->button() == Qt::MidButton)
    {
        qDebug()<<"此时按下的是鼠标中间键";
    }

    //获取坐标位置
    qDebug()<<"点击的窗口位置坐标是: "<<e->x()<<","<<e->y();
}

现象:

3.2 按键事件

3.3 窗口大小改变事件

4.举例说明

bash 复制代码
   1.鼠标点击左键 --》主窗口变成红色
             右键 --》主窗口变成绿色
      大小改变事件
                         void QWidget::resizeEvent(QResizeEvent *event)
                         当窗口 变大 --》要求窗口中所有按钮的字体变大
                         当窗口 变小 --》要求窗口中所有按钮的字体变小
      关闭事件
                         void QWidget::closeEvent(QCloseEvent *event)
                                 要求:当你关闭窗口的时候,模仿有些软件,弹出一个消息盒子,提示亲,你真的要关闭吗--》ok、cancel
   2.键盘按下字母a --》窗口大小改变成  1000*800大小
                int QKeyEvent::key() const
                      返回值:你按下的那个按键的键值,详情请参见QT助手
                void QWidget::resize(int w, int h)

示例代码:

cpp 复制代码
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QEvent>
#include <QMouseEvent>
#include <QResizeEvent>
#include <QFont>
#include <QCloseEvent>
#include <QMessageBox>
#include <QKeyEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //重写鼠标事件的事件响应函数
    void mousePressEvent(QMouseEvent *event);
    void resizeEvent(QResizeEvent *event);
    void closeEvent(QCloseEvent *event);
    void keyPressEvent(QKeyEvent *event);
private:
    Ui::MainWindow *ui;
    int n;
};
#endif // MAINWINDOW_H

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    n=1;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
        this->setStyleSheet("background-color:rgb(255,0,0);");
    else if(event->button()==Qt::RightButton)
        this->setStyleSheet("background-color:rgb(0,255,0);");
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    //保存旧的大小
    const QSize &oldsize=event->oldSize();
    //保存当前大小
    const QSize &cursize=event->size();

    //比较两个大小
    if(cursize.width()>oldsize.width() || cursize.height()>oldsize.height())
    {
        if(n<72)
            n++;
        else
            n=72;
        QFont myfont("楷体",n);
        ui->pushButton->setFont(myfont);
        ui->pushButton_2->setFont(myfont);
        ui->pushButton_3->setFont(myfont);
    }
    if(cursize.width()<oldsize.width() || cursize.height()<oldsize.height())
    {
        if(n>0)
            n--;
        else
            n=1;
        QFont myfont("楷体",n);
        ui->pushButton->setFont(myfont);
        ui->pushButton_2->setFont(myfont);
        ui->pushButton_3->setFont(myfont);
    }
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    //弹出消息盒子
    auto ret=QMessageBox::warning(this,"确定是否关闭","亲!你真的要狠心舍我而去!!",QMessageBox::Ok|QMessageBox::Cancel);
    //判断你点击的是哪个按钮
    if(ret==QMessageBox::Ok)
    {
        //关闭窗口
        this->close();
    }
    else
    {
        //保持原样子,不关闭
        event->ignore(); //忽略关闭事件
    }
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    //获取你按的那个按键
    if(event->key()==Qt::Key_A)
        this->resize(1920,1080);

}
相关推荐
AI+程序员在路上21 分钟前
Qt6.8中进行PDF文件读取和编辑
开发语言·qt·pdf
球求了30 分钟前
Linux 入门:操作系统&&进程详解
linux·运维·服务器·开发语言·学习
像风一样自由202038 分钟前
PyQt5 到 PySide6 技术栈转换详解
开发语言·python·qt
Jack电子实验室1 小时前
基于MATLAB的图像色彩识别项目,彩色图像矩阵识别
开发语言·matlab·矩阵
一个Potato1 小时前
Qt输入控件(QInput Widgets)详解:从基础到实战
qt·microsoft
Enti7c2 小时前
JavaScript 实现输入框的撤销功能
开发语言·javascript·ecmascript
Miracle&2 小时前
Qt 显示QRegExp 和 QtXml 不存在问题
开发语言·qt
(・Д・)ノ4 小时前
python打卡day16
开发语言·python
秋风&萧瑟4 小时前
【QT】QT中的软键盘设计
开发语言·qt