• 【转】Qt鼠标键盘事件


    http://blog.csdn.net/lovebird_27/article/details/50351336

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

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

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

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

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

    鼠标事件

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

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

    #include <QMouseEvent>
    
    
      ···
    // 鼠标按下事件
    void Widget::mousePressEvent(QMouseEvent *event)
    {
        // 如果是鼠标左键按下   改变指针形状,并且存储当前指针位置与窗口位置的差值。
        if(event->button() == Qt::LeftButton){
    
    
            ···
        }
    
    
        // 如果是鼠标右键按下
        else if(event->button() == Qt::RightButton){
    
    
           ···
        }
    }
    
    
    // 鼠标移动事件       默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true); 
    void Widget::mouseMoveEvent(QMouseEvent *event)
    {
        // 这里必须使用buttons()
        if(event->buttons() & Qt::LeftButton){  //进行的按位与
    
    
           ···
        }
    }
    
    
    // 鼠标释放事件
    void Widget::mouseReleaseEvent(QMouseEvent *event)
    {
       ···
    }
    
    
    // 鼠标双击事件
    void Widget::mouseDoubleClickEvent(QMouseEvent *event)
    {
        // 如果是鼠标左键按下
        if(event->button() == Qt::LeftButton){
    
    
          
            ···
    
    
        }
    }
    
    
    // 滚轮事件
    void Widget::wheelEvent(QWheelEvent *event)
    {
        // 当滚轮远离使用者时
        if(event->delta() > 0){
            ···
        }else{//当滚轮向使用者方向旋转时
            ···
        }
    }

    键盘事件

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

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

    #include <QKeyEvent>
    // 键盘按下事件
    void Widget::keyPressEvent(QKeyEvent *event)
    {
        // 是否按下Ctrl键      特殊按键
        if(event->modifiers() == Qt::ControlModifier){
    
    
            // 是否按下M键    普通按键  类似
            if(event->key() == Qt::Key_M)
                ···
        }
        else QWidget::keyPressEvent(event);   //保存默认事件
    
    
        //如果是处理两个普通按键,得避免自动重复,释放中也要处理
        if(event->key() == Qt::Key_Up){
    
    
            // 按键重复时不做处理
            if(event->isAutoRepeat()) return;
    
    
            // 标记向上方向键已经按下
            keyUp = true;
    
    
        }else if(event->key() == Qt::Key_Left){
            if(event->isAutoRepeat()) return;
            keyLeft = true;
        }
    }
    
    
    
    
    
    
    // 按键释放事件
    void Widget::keyReleaseEvent(QKeyEvent *event)
    {
        ···
    	
        //如果是处理两个普通按键,得避免自动重复
       if(event->key() == Qt::Key_Up){
            if(event->isAutoRepeat()) return;
    
    
     
     	···       
    
    
           
        }
        else if(event->key() == Qt::Key_Left){
            if(event->isAutoRepeat()) return;
    
    
           ···
          
       }
    }

    Z

  • 相关阅读:
    sql求两表的并集、交集、非交集、差集、结果集排序
    c# 为什么要使用Array、ArrayList、List?
    C# 实例化的执行顺序(转)
    正则捕获url的?号传值
    mvc5中重命名项目的名称后,出现"找到多个与名为“Home”的控制器匹配的类型"
    微信开发资料
    windows下建立netcore控制台程序,然后传送到centos7下的docker容器里运行
    error MSB3552: Resource file "**/*.resx" cannot be found. [/ConsoleApp1.csproj]
    c# 编译期常量const和运行时常量readonly
    c# 多线程之-- System.Threading Timer的使用
  • 原文地址:https://www.cnblogs.com/cppskill/p/8295148.html
Copyright © 2020-2023  润新知