【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);

}
相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript