QT事件与软键盘

本文介绍了QT中的事件机制,包括事件的定义、事件的产生和派发流程,以及常见事件类型如移动、关闭、大小改变和鼠标键盘事件。同时,展示了如何重写事件处理函数以实现特定功能,如窗口大小改变时的检测,并给出了利用按键事件创建软键盘的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqb_newfarmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值