QT 事件处理

  1. 鼠标事件

    鼠标事件包含鼠标移动、鼠标键按下、松开、单击和双击等。
    使用的时候要包含头文件<QMouseEvent>
    鼠标的移动事件响应,通过重定义mouseMoveEvent(QMouseEvent *e)函数实现

    e->x();e->y(); // 获取鼠标的相对位置  
    

    鼠标的按下事件响应,通过重定义mousePressEvent(QMouseEvent *e)函数实现

    if(e->button()==Qt::LeftButton)   // Qt::RightButton 右键 Qt::MidButton中键
    {
        statusBar()->showMessage(tr("左键:")+str);
    }
    

    鼠标的松开事件响应,通过重定义mouseReleaseEvent(QMouseEvent *e)函数实现
    鼠标的双击事件响应,通过重定义mouseDoubleClickEvent(QMouseEvent *e)函数实现
    this->setMouseTracking(true);// 窗体追踪鼠标。true为追踪,false为不追踪

  2. 键盘事件

    使用的时候要包含头文件<QKeyEvent>
    通过重定义keyPressEvent(QKeyEvent *)keyReleaseEvent(QKeyEvent *)实现

    // Qt::KeyboardModifier定义的一系列修饰键
    // Qt::ControlModifier  【Ctrl】键
    // Qt::NoModifier        没有修饰键
    // Qt::AltModifier      【Alt】键
    // Qt::MetaModifier      Meta键,一般Linux键盘上有
    // Qt::KeypadModifier    小键盘按键
    
    if(event->modifiers()==Qt::ControlModifier)
    {
        if(event->key()==Qt::Key_Left)                            // 组合件Ctrl+左键的组合键
        {
        }
    }
    else								//对【Ctrl】键没有按下的处理
    {
        if(event->key()==Qt::Key_Left)	
        {
        }
    }
    
  3. 事件过滤
    主要函数,函数原型

    void QObject::installEventFilter(QObject * filterObj);// 增加事件过滤
    
    void QObject::removeEventFilter(QObject * filterObj); // 移除事件过滤
    
    bool eventFilter(QObject *watched, QEvent *event);    // 事件过滤函数,如果过滤了则返回true,否则返回false
    

    示例

    // 增加过滤事件
    label1->installEventFilter(this);
    label2->installEventFilter(this);
    label3->installEventFilter(this);
    
    // 事件过滤函数
    bool EventFilter::eventFilter(QObject *watched, QEvent *event)
    {
        if(watched==label1)			//首先判断当前发生事件的对象
        {
            // 判断发生的事件类型
            if(event->type()==QEvent::MouseButtonPress)
            {
                // 将事件event转化为鼠标事件
                QMouseEvent *mouseEvent=(QMouseEvent *)event;
                /* 以下根据鼠标的按键类型分别显示 */
                if(mouseEvent->buttons()&Qt::LeftButton)
                {
                    stateLabel->setText(tr("左键按下左边图片"));
                }
                else if(mouseEvent->buttons()&Qt::MidButton)
                {
                    stateLabel->setText(tr("中键按下左边图片"));
                }
                else if(mouseEvent->buttons()&Qt::RightButton)
                {
                    stateLabel->setText(tr("右键按下左边图片"));
                }
                /* 显示缩小的图片 */
                QMatrix matrix;
                matrix.scale(1.8,1.8);
                QImage tmpImg=Image1.transformed(matrix);
                label1->setPixmap(QPixmap::fromImage(tmpImg));
            }
            /* 鼠标释放事件的处理,恢复图片的大小 */
            if(event->type()==QEvent::MouseButtonRelease)
            {
                stateLabel->setText(tr("鼠标释放左边图片"));
                label1->setPixmap(QPixmap::fromImage(Image1));
            }
        }
        ......
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值