QT中的事件
- 1.事件的定义和作用
- 2.QT中事件产生和派发流程
-
- [2.1 步骤](#2.1 步骤)
- [2.2 图示](#2.2 图示)
- 3.常见的事件
- 4.举例说明
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);
}