zoukankan      html  css  js  c++  java
  • Qt 事件总结(鼠标、键盘) QMouseEvent、QKeyEvent

    Qt 程序需要在main()函数创建一个QCoreApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行

    exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于

    QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对

    象按照它们不同的类型,分发给不同的事件处理器(event handler)。

    如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。

     

    鼠标事件

    1     void mousePressEvent(QMouseEvent *event);        //单击
    2     void mouseReleaseEvent(QMouseEvent *event);      //释放
    3     void mouseDoubleClickEvent(QMouseEvent *event);  //双击
    4     void mouseMoveEvent(QMouseEvent *event);         //移动
    5     void wheelEvent(QWheelEvent *event);             //滑轮

    鼠标事件使用的时候,加头文件

    #include <QMouseEvent>
     1 // 鼠标按下事件
     2 void Widget::mousePressEvent(QMouseEvent *event)
     3 {
     4     // 如果是鼠标左键按下   改变指针形状,并且存储当前指针位置与窗口位置的差值。
     5     if(event->button() == Qt::LeftButton){
     6         ···
     7     }
     8     // 如果是鼠标右键按下
     9     else if(event->button() == Qt::RightButton){
    10        ···
    11     }
    12 }
    13 // 鼠标移动事件       默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true); 
    14 void Widget::mouseMoveEvent(QMouseEvent *event)
    15 {
    16     // 这里必须使用buttons()
    17     if(event->buttons() & Qt::LeftButton){  //进行的按位与
    18        ···
    19     }
    20 }
    21 // 鼠标释放事件
    22 void Widget::mouseReleaseEvent(QMouseEvent *event)
    23 {
    24    ···
    25 }
    26 // 鼠标双击事件
    27 void Widget::mouseDoubleClickEvent(QMouseEvent *event)
    28 {
    29     // 如果是鼠标左键按下
    30     if(event->button() == Qt::LeftButton){
    31       
    32         ···
    33     }
    34 }
    35 // 滚轮事件
    36 void Widget::wheelEvent(QWheelEvent *event)
    37 {
    38     // 当滚轮远离使用者时
    39     if(event->delta() > 0){
    40         ···
    41     }else{//当滚轮向使用者方向旋转时
    42         ···
    43     }
    44 }

    键盘事件

    1 void keyPressEvent(QKeyEvent *event);
    2 void keyReleaseEvent(QKeyEvent *event);

    键盘事件使用时,加头文件

    
    
    #include <QKeyEvent>
     1 // 键盘按下事件
     2 void Widget::keyPressEvent(QKeyEvent *event)
     3 {
     4     // 是否按下Ctrl键      特殊按键
     5     if(event->modifiers() == Qt::ControlModifier){
     6         // 是否按下M键    普通按键  类似
     7         if(event->key() == Qt::Key_M)
     8             ···
     9     }
    10     else QWidget::keyPressEvent(event);   //保存默认事件
    11 
    12     //如果是处理两个普通按键,得避免自动重复,释放中也要处理
    13     if(event->key() == Qt::Key_Up){
    14         // 按键重复时不做处理
    15         if(event->isAutoRepeat()) return;
    16         // 标记向上方向键已经按下
    17         keyUp = true;
    18     }else if(event->key() == Qt::Key_Left){
    19         if(event->isAutoRepeat()) return;
    20         keyLeft = true;
    21     }
    22 
    23 }
    24 // 按键释放事件
    25 void Widget::keyReleaseEvent(QKeyEvent *event)
    26 {
    27     ···
    28     
    29     //如果是处理两个普通按键,得避免自动重复
    30    if(event->key() == Qt::Key_Up){
    31         if(event->isAutoRepeat()) return;
    32  
    33      ···       
    34        
    35     }
    36     else if(event->key() == Qt::Key_Left){
    37         if(event->isAutoRepeat()) return;
    38        ···
    39       
    40    }
    41 
    42 }
  • 相关阅读:
    如果拷贝项目出现各种找不到文件的时候,基本就是没有标记,或者文件名的问题,Could not find resource mybatis.xml,解决方法
    The error may exist in com/bjpowernode/dao/StudentDao.xml ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderExcept
    一个简单jpa例子
    @PathVariable
    java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决
    yml中driver-class-name: com.mysql.jdbc.Driver 解析不到的问题
    docker 操作镜像的基本操作
    Navicat 远程连接Docker容器中的mysql 报错:1251
    spring boot中常用的配置文件的重写
    MVC最全jar包
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12698864.html
Copyright © 2011-2022 走看看