QT中的事件

2023-11-17

目录

1、QT事件

1.1、事件介绍

1.2、事件的处理

2、键盘事件

2.1、keyPressEvent

2.1.1、判断某个键按下

 2.1.2、组合键操作

3、鼠标事件

3.1、鼠标单击事件

3.2、鼠标释放事件

3.3、鼠标双击事件

3.4、鼠标移动事件

3.5、滚轮事件

4、事件过滤器

4.1、事件过滤器使用

5、定时器

5.1、QTimerEvent定时器实现

5.2、QTimer定时器实现

6、随机数种子

7、拖拽事件

拓(设置右键菜单栏):


1、QT事件

1.1、事件介绍

        事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。在Qt中使用一个对象来表示一个事件,它继承自QEvent类。

常见事件:鼠标事件、键盘事件、定时事件、上下文菜单事件、关闭事件、拖放事件、绘制事件。

1.2、事件的处理

重载相关的Event函数

重新实现事件的paintEvent(),mousePressEvent()等事件处理函数。这是最常用也的一种方法,不过它只能用来处理特定部件的特定事件。例如实现拖放操作,就是用的这种方法。

安装事件过滤器

在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。

2、键盘事件

QKeyEvent

QKeyEvent类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输入焦点的部件。

在Qt助手中,查找一下Qt::Key。

例:Qt::Key_Escape表示空格,Qt::Key_Left←键等等

2.1、keyPressEvent

        这个是需要包含头文件才能用,下面是从头文件中拿出来的

protected:    
    bool event(QEvent *event) Q_DECL_OVERRIDE;    
    virtual void mousePressEvent(QMouseEvent *event);//鼠标按下    
    virtual void mouseReleaseEvent(QMouseEvent *event);//鼠标释放    
    virtual void mouseDoubleClickEvent(QMouseEvent *event);//鼠标双击    
    virtual void mouseMoveEvent(QMouseEvent *event);//鼠标移动
#ifndef QT_NO_WHEELEVENT    
    virtual void wheelEvent(QWheelEvent *event); //滚轮
#endif    
    virtual void keyPressEvent(QKeyEvent *event);//按键按下    
    virtual void keyReleaseEvent(QKeyEvent *event);//按键释放    
    virtual void enterEvent(QEvent *event);//进入    
    virtual void leaveEvent(QEvent *event);//离开    
    virtual void paintEvent(QPaintEvent *event);//绘制    
    virtual void moveEvent(QMoveEvent *event);//离开

         这里父类是怎么定义的虚函数,和声明的我们就怎么实现它

//自己的类中去定义,然后实现
protected:
virtual void keyPressEvent(QKeyEvent *event);//按键按下

2.1.1、判断某个键按下

void Widget::keyPressEvent(QKeyEvent *event){    
    if(event->key()==Qt::Key_X)   {        
    qDebug()<<"X按下";   
    }
}

 2.1.2、组合键操作

        在Qt助手中搜索Qt::KeyboardModifier,如下 

void Widget::keyPressEvent(QKeyEvent *event){    
    if(event->modifiers()==Qt::ControlModifier)//判断是不是ctrl按下
    {        
        if(event->key()==Qt::Key_X)//接着判断是不是x按下
        {            
            qDebug()<<"ctrl+X";       
        }   
    }else if(event->key()==Qt::Key_X)   
    {        qDebug()<<"X按下";   
    }
}

3、鼠标事件

        QMouseEvent类用来表示一个鼠标事件,当在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件。利用QMouseEvent类可以获知鼠标是哪个键按下了,还有鼠标指针的当前位置等信息。通常是重定义部件的鼠标事件处理函数来进行一些自定义的操作。  

        QWheelEvent类用来表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离。在滚轮事件处理函数中,使用QWheelEvent类的delta()函数获取了滚轮移动的距离,每当滚轮旋转一下,默认的是15度,当滚轮向远离使用者的方向旋转时,返回正值;当向着靠近使用者的方向旋转时,返回负值。这样便可以利用这个函数的返回值来判断滚轮的移动方向。

3.1、鼠标单击事件

Qt::LeftButton  左
Qt::RightButton 右
Qt::MidButton   中
void Widget::mousePressEvent(QMouseEvent *event){    
    if(event->button()==Qt::LeftButton)   {        
    qDebug()<<"左键按下";   
    }
}

3.2、鼠标释放事件

void Widget::mouseReleaseEvent(QMouseEvent *event){    
    if(event->button()==Qt::LeftButton)   {        
        qDebug()<<"左键释放";   
    }
}

3.3、鼠标双击事件

void Widget::mouseDoubleClickEvent(QMouseEvent *event){    
    if(event->button()==Qt::LeftButton)   {        
        qDebug()<<"左键双击";   
    }
}

3.4、鼠标移动事件

        setMouseTracking(true); 这个默认是为false,需要设置为true,这样才能实时获取鼠标位置,要不然只有在按下的时候才能获取到

void Widget::mouseMoveEvent(QMouseEvent *event)
{    
    qDebug()<<event->x()<<event->y();    
    qDebug()<<event->pos();//相对于窗口的坐标    
    qDebug()<<event->globalPos();//相对于屏幕的坐标
}

3.5、滚轮事件

void Widget::wheelEvent(QWheelEvent *event){    
    static int x=0;    
    x+=event->delta();//还是±120    
    if(event->delta()>0)   
    {        
        qDebug()<<"滚轮往前"<<x;   
    }else{        
        qDebug()<<"滚轮往后"<<x;   
    }
}

4、事件过滤器

         有事件产生,在这个控件上只处理什么事件

         例如:在某个对话框输入任意信息但是是不会被输入到里面,会被获取

4.1、事件过滤器使用

//1、安装过滤器
ui->textEdit->installEventFilter(this);
//2、实现过滤器
//2.1、先声明函数
protected:
    virtual bool eventFilter(QObject *watched, QEvent *event);
//2.2、重写函数
bool Widget::eventFilter(QObject *watched, QEvent *event){
    if(watched == ui->textEdit){//2.2.1、设置你需要监听的部件
        if(event->type() == QEvent::KeyPress){//2.2.2、如果为键盘上按下的某个按键
            //测试效果
            QKeyEvent *keyen = static_cast<QKeyEvent*>(event);
            qDebug() << keyen->key();//输出按键的键值
            return true;
        }else{
            return false;
        }
    }
    return Widget::eventFilter(watched,event);//这个函数需要一直在监视所以这里是一个递归
}

 效果展示:

         这里不难看出,该部件已经将按键按下的时间捕捉到,这种情况可以参考某登录见面禁止复制粘贴很类似,但是输入法没有屏蔽掉。如果是其他的控件,也是同样的做法。

5、定时器

        定时器分为QTimerEvent和QTimer这2个类

        QTimerEvent类用来描述一个定时器事件。对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval )函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来代表这个定时器。当定时器溢出时就可以在timerEvent()函数中获取该定时器的编号来进行相关操作。  

        QTimer类来实现一个定时器,它提供了更高层次的编程接口,比如可以使用信号和槽,还可以设置只运行一次的定时器。 

5.1、QTimerEvent定时器实现

1、设置定时器
private: 
    int id1;    
    int c;//看效果的
2、设置时间
    c = 1;
    id1=startTimer(c);//1毫秒
3、函数实现
protected:
    virtual void timerEvent(QTimerEvent *event);

void Widget::timerEvent(QTimerEvent *event){
    if(event->timerId() == id1){
        qDebug()<<id1;
        c+=1;
        id1 = startTimer(c);
    }
}
    

效果展示

 5.2、QTimer定时器实现

//1、设置定时器
private:
    QTimer t1;    
    QTimer t2;

//2、设置时间
    t1.start(1000);//1000毫秒    
    t2.start(2000);

/*3、关联信号和槽
    槽函数,指的是这个时间到了要执行什么函数
*/
private slots:    
    void qDebugSlot1();    
    void qDebugSlot2();
void Widget::qDebugSlot1(){    
    qDebug()<<"t1";
}
void Widget::qDebugSlot2(){    
    qDebug()<<"t2";
}
connect(&t1,SIGNAL(timeout()),this,SLOT(qDebugSlot1()));   connect(&t2,SIGNAL(timeout()),this,SLOT(qDebugSlot2()));

6、随机数种子

         在使用qrand()函数产生随机数之前,一般要使用qsrand()函数为其设置初值,如果不设置初值,那么每次运行程序,qrand()都会产生相同的一组随机数。为了每次运行程序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。

qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//设置随机数种子
int rand = qrand() % 300;//获取随机数

7、拖拽事件

         就是可以直接拖放文件到程序中打开。

        例:拖入一个文本到程序中,把这个文本里面的内容都获取到程序上

包含头文件,用的wideget窗口
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>

1、函数声明:
protected:
    virtual void dragEnterEvent(QDragEnterEvent *event); //拖拽事件
    virtual void dropEvent(QDropEvent *event);//放下事件
2、函数实现
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    //判断小部件上有没有事件
    if(event->mimeData()->hasUrls())
    {
        event->acceptProposedAction();  //事件给过去
    }else{
        event->ignore(); //忽略
    }
}

void Widget::dropEvent(QDropEvent *event)
{
    const QMimeData*mimeData=event->mimeData();
    if(!mimeData->hasUrls()){return;}
    QList<QUrl> urlList=mimeData->urls();//有多少个文件被拖过来
    for(int i=0;i<urlList.size();i++)//遍历
    {
        qDebug()<<urlList.at(i).toLocalFile();
    }
    QFile file(urlList.at(0).toLocalFile());//获取第一个文件的内容
    file.open(QIODevice::ReadOnly);
    QByteArray ba;
    ba=file.readAll();
    ui->textEdit_2->setPlainText(QString::fromLocal8Bit(ba));
}

3、接受事件
this->setAcceptDrops(true); //接受拖拽事件   
这个指的是窗口的,在这个窗口上面有一个多行纯文本控件

效果展示 

拓(设置右键菜单栏):

1、定义成员变量
private:
    QMenu *popMenu;               //右键弹出式菜单
    QAction *adjustTimeAction;    //右键弹出式菜单中的内容 调整功能1
    QAction *adjustDateAction;    //功能2
    QAction *quitAction;          //退出

2、函数声明
protected:
    virtual void contextMenuEvent(QContextMenuEvent *event);

3、函数实现
void Widget::contextMenuEvent(QContextMenuEvent *event){    //右键会触发这个事件
            popMenu->clear();
            popMenu->addAction(adjustTimeAction);
            popMenu->addAction(adjustDateAction);
            popMenu->addSeparator();//添加线

            popMenu->addAction(quitAction);
            //popMenu->exec(); //堵住
            popMenu->exec(QCursor::pos());
}

4、关联信号与槽以及设置(在ui->setupUi(this);之后)
    popMenu = new QMenu(this);
    popMenu->setStyleSheet(QStringLiteral("background-color: rgb(99, 99, 99);"));
    adjustTimeAction = new QAction(this);
    adjustTimeAction->setText(("功能1"));
    adjustDateAction = new QAction(this);
    adjustDateAction->setText(("功能2"));
    quitAction = new QAction(this);
    quitAction->setText(("退出"));
    connect(quitAction, SIGNAL(triggered(bool)),this, SLOT(close()));//关联退出的Action
    

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT中的事件 的相关文章

随机推荐

  • 矩阵转置代码,速度优化

    今天心血来潮 想写个CPU版本的矩阵转置代码 过几天写GPU版本的 按照我的想法 就是以下几种方式 1 gt 整块矩阵转置 横读纵写或纵读横写 2 gt 将矩阵分成固定大小的block block与block可以分成横读纵写或纵读横写 而b
  • const修饰成员函数

    常函数 成员函数后加const后 我们称这个函数为常函数 在常函数内不可以修改成员的属性 成员属性声明时加关键字mutable后 在常函数中依然可以修改 常对象 声明对象前加const称该对象为常对象 常对象不能在类外修改其成员属性 但可以
  • K8s(Kubernetes)工具

    文章目录 Kubernetes简介 kubernetes背景和历史 kubernetes特点 kubernetes相关概念 基本对象 Pod Service Volume 持久存储卷 Persistent Volume PV 和持久存储卷声
  • linux怎么用python运维命令_运维笔记--linux环境提示python: command not found

    场景描述 新部署的容器环境 终端执行python命令 提示没有该命令 从报错异常可以看出 可能是python环境未安装 分析思路 检查python路径 方式一 type a python 方式二 ls l usr bin python ls
  • 【python总结】python学习框架梳理

    目录 基础 注释与变量名等基本规则 关键字 操作符 数字 流程控制 序列 文本序列 字符串 二进制序列 字节 列表 元组 映射 字典 集合 函数 面向对象编程 错误和异常 模块 数据结构与算法 数组 字符串 链表 二分查找 排序 栈 队列
  • 企业微信回调-通讯录改变回调

    https work weixin qq com api doc 90000 90135 90966 先配置url token encodingAESKey import com ichangtou common util AesExcep
  • Maven环境正常,打包后使用报 java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream 错误

    也是找的网上的解决方法 下载一个tomcat 里面包含着必要的jar包 然后把TOMCAT PATH common lib servlet api jar复制出来 放到 JDK PATH jre lib ext下面 如果不行就重启一下项目
  • 区块链都记录了哪些信息?

    区块如何连接成区块链 之前的文章里又说到区块链 想要知道区块链上的信息首先需要了解一下什么是区块链 区块链其实是一串使用密码学算法产生的区块连接而成 每一个区块上写满了交易记录 区块按顺序相连形成链状结构 就像世界上的电脑一样 电脑每一台电
  • 十四、内置模块path、邂逅Webpack和打包过程、css-loader

    一 内置模块path 1 path介绍 2 path常见的API 这里重点讲一下path resolve 看上面的例子 从右往左开始解析 所以一开始解析的就是 abc txt 这个时候就会把它当成一个绝对路径了 为什么 因为看到斜杠 默认就
  • httpclient工具类

    import java io IOException import java net URI import java util ArrayList import java util List import java util Map imp
  • Channel-wise Knowledge Distillation for Dense Prediction阅读笔记

    Channel wise KD阅读笔记 一 Title 二 Summary 三 Research Object 四 Problem Statement 五 Method 5 1 spatial distillation 5 2 Channe
  • macOS使用 之 读写NTFS格式磁盘

    因为版权问题 macOS并没有开放是支持Windows NTFS 格式硬盘的写入操作 因此对MAC用户使用移动磁盘造成了极大的困扰 下面楼主就来介绍一下mac系统中读取NTFS格式的简单办法 1 使用常见付费软件 如果你土豪级别的人物 不在
  • CHROME扩展开发之·消息传递Message(window.message)

    由于content scripts运行在Web页面的上下文中 属于Web页面的组成部分 而不是Google Chrome扩展程序 但是content scripts又往往需要与Google Chrome扩展程序的其他部分通信以共享数据 这可
  • 小红书流量逻辑、KOL模型、内容营销

    小红书平台专项课 品牌营销训练营 融合了千瓜历年研究和整理的成果 结合实际案例给到大家最全最干货的内容 本文选取了课程中的精华部分 为大家提供一份历年品牌营销投放的实操总结 助力2022年品牌营销增长 从消费者层级到消费者决策 从品牌内容营
  • 【Transformer学习笔记】VIT解析

    很久以前科学家做过一个生物实验 发现视觉神经元同样可以被训练来作听觉神经元之用 受此启发 不少计算机研究者也在寻找着机器学习领域的大一统 将CV任务和NLP任务使用相同或者类似的结构进行建模 随着transformer在nlp领域已经杀出了
  • 微信小程序使用本地图片在真机预览不显示的问题解决

    开发工具上本地图片可以显示 但是在真机上预览的时候不能显示 通常我们代码路径是代码是这样写的
  • 什么是 Python?Python 基础编程入门指南,带你从零开始深入了解

    Python是当今最流行的编程语言之一 Python以其简单的语法和多功能性而闻名 既易于学习又可用于高级应用程序 可以使用Python的领域也非常广泛 人工智能 机器学习 Web 开发 基本上绝大多数热门的域都能看到Python的身影 今
  • MODBUS CRC校验原理及C语言实现

    MODBUS通信协议的CRC校验原理多项式为8005的逆序A001 列01的CRC校验原理 1111111111111111 初始化CRC寄存机 0000000000000001 1111111111111110 异或 0111111111
  • pread介绍

    1 先来介绍pread函数 root bogon mycode cat test c include
  • QT中的事件

    目录 1 QT事件 1 1 事件介绍 1 2 事件的处理 2 键盘事件 2 1 keyPressEvent 2 1 1 判断某个键按下 2 1 2 组合键操作 3 鼠标事件 3 1 鼠标单击事件 3 2 鼠标释放事件 3 3 鼠标双击事件