Qt 鼠标事件,键盘事件

来源

Qt中部分控件没有鼠标信号,比如Frame中没有clicked信号,需要充从事件过滤器中获取鼠标事件,在进行处理。关于如何处理事件过滤器见博文http://blog.csdn.net/jh1513/article/details/53311084
这里主要处理鼠标事件

方法

从事件过滤器中捕获鼠标时间,事件过滤器两个函数分别是installEventFilter()和eventFilter(QObject *obj, QEvent *ev),第二个函数可以获得鼠标事件对应的对象和事件类型。再在事件过滤器函数中处理该鼠标事件,但是该方法中捕获的鼠标事件时,我对鼠标左键的信号没法响应,左键右键都是响应右键。


  • 直接使用QMouseEvent中的事件,Qt帮助文档中有介绍,但是该方法似乎不能捕获到鼠标所在的对象?
    第一步:只需在相应的.h文件中添加mousePressEvent事件(此函数名不能改为其他的名称,因为当鼠标移动时,系统就会去寻找名为mouseMoveEvent的函数执行。)
    第二步:只需在对于的.cpp文件中实现该函。

鼠标事件

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

键盘事件

#include <QKeyEvent>
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);

示例

事件过滤器方式,由于我这边该方法中不能区分鼠标左键右键,所以当获得鼠标事件是在我关心的控件上发生的时候,将事件由QEvent转换成QMouseEvent,判断是左键还是右键。可能是我这边电脑或程序的问题

bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
{
    if(obj == ui->frame){
        if(ev->type() == QEvent::MouseButtonDblClick ){ //判断鼠标双击事件
                        return true;    //该事件已处理
        }
        **//在QEvent中,我判断鼠标是左键还是右键时遇到问题,故将QEvent转换成QMouseEvent来判断**
        *QMouseEvent *event = (QMouseEvent*)ev;*
        if(event->button() == Qt::LeftButton){  //鼠标左键相应
            qDebug()<<"++++ 000  ++++";
             return true;                       //该事件已经被处理
        }
        if(event->button() == Qt::RightButton){ //鼠标右键相应
            qDebug()<<"++++ 111  ++++";
             return true;                       //该事件已经被处理
        }
    }
    return true;
}

在类.h中

protected:
     void MainWindow::mousePressEvent(QMouseEvent *event);

.cpp中

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    //这里给出两种区分左键信号的方法
    //[1]
    if(event->button() == Qt::LeftButton){
        qDebug()<<"++++ 123  ++++";
    }
    //[1]
    //[2]
    if(qApp->mouseButtons() == Qt::LeftButton){
        qDebug()<<"++++ 456  ++++";
    }
    //[2]
    if(event->button() == Qt::RightButton){
        qDebug()<<"++++ 789  ++++";
    }
}

附键盘事件

Qt 程序需要在main()函数创建一个QCoreApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。
如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了
键盘事件
在头文件中添加键盘事件处理函数,在源文件中实现想相应代码

#include <QKeyEvent>
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
// 键盘按下事件
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;
        } 
   }
}

链接

Qt事件过滤器
http://blog.csdn.net/jh1513/article/details/53311084

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

http://blog.csdn.net/subkiller/article/details/8302941

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值