1.什么是事件,事件有什么作用
通俗的话:用户对于QT程序所做的任何行为动作,都叫做事件
比如:用户用鼠标点击了窗口 --》鼠标点击事件
用户按下了键盘上的某个按键 --》按键事件
用户用鼠标把窗口拉大,拉小 --》窗口大小改变事件
用户用鼠标把窗口拖动 --》移动事件
QT中往往用事件来做一些复杂的功能
比如:窗口放大的时候 --》窗口背景色不断的变红
获取物理键盘输入的字符
判断我点击的是鼠标的左键还是鼠标的右键,中间键
QEvent --》QT中所有事件的父类2.QT中事件产生和派发流程(理论知识)
事件派发 ->事件过滤 ->事件分发 ->事件处理
事件派发:事件派发 是由Qt框架(QApplication 对象)来完成的,它将当前应用程序产生的事件派发给对应的窗口
事件过滤:事件在到达对应的窗口之前,可以被其他对象过滤、拦截、处理
事件分发:每个窗口都会有一个事件分发器,事件分发器会对事件进行分类,再将分好类的事件分发给对应的事件处理函数进行处理,每个事件处理函数的功能其实是非常单一的,只处理当前这一类事件
事件处理:窗口的事件处理函数,对当前事件进行处理
3.常见的事件和对应的事件处理函数
常用的事件
QMoveEvent --》移动事件(只要你用鼠标拖着某个组件到处跑)
QCloseEvent --》关闭事件(只要你关闭一个窗口)
QResizeEvent --》大小改变事件(只要一个组件大小发生变化)
QMouseEvent --》鼠标事件
void QWidget::mouseDoubleClickEvent(QMouseEvent *event) //鼠标双击
void QWidget::mouseMoveEvent(QMouseEvent *event) //鼠标移动
void QWidget::mousePressEvent(QMouseEvent *event) //鼠标按下去
void QWidget::mouseReleaseEvent(QMouseEvent *event) //鼠标松开
QKeyEvent --》按键事件
事件处理函数:当某个事件产生以后,QT都有对应的事件处理函数(函数原型QT都已经定义好了,程序员可以重写这些函数,实现自己的逻辑)
事件一旦产生,对应的事件处理函数就会被自动调用4.利用按键事件实现软键盘
判断窗口是否拉大缩小?
//重写窗口大小改变事件的处理函数
void resizeEvent(QResizeEvent *event);
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
QSize size1=event->oldSize(); //获取老的尺寸
QSize size2=event->size(); //获取新的尺寸
//判断窗口是不是拉大了
if(size2.width()>size1.width() || size2.height()>size1.height())
qDebug()<<"窗口拉大了";
if(size2.width()<size1.width() || size2.height()<size1.height())
qDebug()<<"窗口缩小了";
}
event函数会接收所有的事件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//重写父类的event
bool MainWindow::event(QEvent *event)
{
//qDebug()<<"主窗口所有的事件全部都被我自己写的event函数接收了";
if(event->type()==QEvent::Close) //窗口关闭
qDebug()<<"窗口关闭";
if(event->type()==QEvent::Enter) //鼠标进入窗口边界
qDebug()<<"鼠标进入窗口边界";
if(event->type()==QEvent::FocusIn)
qDebug()<<"键盘光标进入";
if(event->type()==QEvent::FocusOut)
qDebug()<<"键盘光标离开";
if(event->type()==QEvent::HoverEnter)
qDebug()<<"鼠标光标进入";
if(event->type()==QEvent::HoverLeave)
qDebug()<<"鼠标光标离开";
if(event->type()==QEvent::Leave)
qDebug()<<"鼠标离开窗口边界";
if(event->type()==QEvent::Move)
qDebug()<<"窗口被你拖着跑";
if(event->type()==QEvent::KeyPress)
qDebug()<<"键盘按键按下去";
}
每种事件都有自己的处理函数
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QCloseEvent>
#include <QMoveEvent>
#include <QResizeEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
//重写鼠标的事件处理函数
void mouseDoubleClickEvent(QMouseEvent *event); //鼠标双击
void mouseMoveEvent(QMouseEvent *event);
//重写按键事件的处理函数
void keyPressEvent(QKeyEvent *event);
//重写关闭事件的处理函数
void closeEvent(QCloseEvent *event);
//重写大小改变事件的处理函数
void resizeEvent(QResizeEvent *event);
//重写移动事件的处理函数
void moveEvent(QMoveEvent *event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
qDebug()<<"你双击的位置坐标是: "<<event->x()<<" "<<event->y();
//判断左右键,还是中间键
if(event->button()==Qt::LeftButton)
qDebug()<<"用户使用的左键双击";
if(event->button()==Qt::RightButton)
qDebug()<<"用户使用的右键双击";
if(event->button()==Qt::MidButton)
qDebug()<<"用户使用的中间键双击";
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
}
void MainWindow::closeEvent(QCloseEvent *event)
{
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
}
void MainWindow::moveEvent(QMoveEvent *event)
{
}
软键盘
#include "mybutton.h"
#include <QDebug>
#include <QKeyEvent>
#include <QCoreApplication>
#include <QApplication>
mybutton::mybutton(QWidget *p):QPushButton(p)
{
//关联clicked信号跟自己的槽函数
connect(this,SIGNAL(clicked()),this,SLOT(fun()));
}
//这个按钮类所有的按钮对象都是调用这个槽函数
void mybutton::fun()
{
QKeyEvent *keyevent;
//qDebug()<<"你点击了某个按钮";
mybutton *p=qobject_cast<mybutton *>(sender());
//获取你按的按键的字面值
QString str=p->text(); //"a" "s" "d"
qDebug()<<str;
//判断特殊按键
if(str=="En") //回车
keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Enter,Qt::NoModifier,str);
else if(str=="<---") //退格键
keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Backspace,Qt::NoModifier,str);
else if(str=="space") //空格
keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Space,Qt::NoModifier," ");
else //字母按键
{
char n=str.at(0).toLatin1();
//利用按键事件实现软键盘
//定义按键事件
keyevent=new QKeyEvent(QEvent::KeyPress,n-32,Qt::NoModifier,str);
}
//发送这个事件
return QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);
}