您的位置:首页 > 编程语言 > Qt开发

Qt 鼠标事件,键盘事件

2016-11-23 20:33 1266 查看

来源

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息